我想在关卡编辑器中读取 Lua 文件,这样我就可以以可视化格式显示其数据供用户编辑。
如果我有一个像这样的 Lua 表:
properties = {
Speed = 10,
TurnSpeed = 5
}
Run Code Online (Sandbox Code Playgroud)
Speed显然是关键和10价值。我知道如果我知道像这样的键,我可以访问该值(前提是该表已经在堆栈上):
lua_pushstring(L, "Speed");
lua_gettable(L, idx);
int Speed = lua_tointeger(L, -1);
lua_pop(L, 1);
Run Code Online (Sandbox Code Playgroud)
我想要做的是在 C++ 中访问键的名称和相应的值。这可以做到吗?如果是这样我该怎么办?
我有一个值表,原则上可以是任意长度:
Points =
{
"Point #1",
"Point #5",
"Point #7",
"Point #10",
"Point #5",
"Point #11",
"Point #5",
}
Run Code Online (Sandbox Code Playgroud)
我想将它们作为参数传递给函数。
addPath(<sPathName>, <sPoint>, <sPoint>, ...)
Run Code Online (Sandbox Code Playgroud)
现在,通常您可以使用“呼叫”功能。但在我使用的软件中,此功能不可用且不在范围内。
我如何在 Lua 4 中解决这个问题?
[编辑]
以下是我可以使用的功能。
我有以下代码:
local ta = { nil, nil, nil, 1, a = 2 }
local tb = { [4] = 1, a = 2 }
for i = 1, #ta do
print('ta['..i..']= ', ta[i])
end
for i = 1, #tb do
print('tb['..i..']= ', tb[i])
end
Run Code Online (Sandbox Code Playgroud)
并获得以下输出:
ta[1]= nil
ta[2]= nil
ta[3]= nil
ta[4]= 1
Run Code Online (Sandbox Code Playgroud)
我假设两个表都应该相同.但它并不完全.
我尝试使用空构造函数创建表,并逐个初始化元素,包括开头的nils.但是与表tb得到了相同的结果.
有什么区别?我可以手动管理吗?
嗯,赋值之间有什么区别:
Lesson["Maths"] = {grade = 10, class = 3}
Run Code Online (Sandbox Code Playgroud)
和
Lesson["Maths"] = {["grade"] = 10, ["class"] = 3}
Run Code Online (Sandbox Code Playgroud)
如果我想为表中的键分配值,我应该选择哪一个?或者说哪一种用的比较多?多谢
我目前面临的问题是你不能__gc在 Lua 5.1 中使用表的方法,因为它们是在 Lua 5.2 中实现的。但是,我想在收集 lua 表后释放分配的本机资源。是否可以制定一个解决方法,__gc为 Lua 5.1 提供 Lua 5.2 中元方法的功能?
有更简单的方法吗?我需要获取表中的第一个值,其索引是整数但可能不会从[1]开始.谢谢!
local tbl = {[0]='a',[1]='b',[2]='c'} -- arbitrary keys
local result = nil
for k,v in pairs(tbl) do -- might need to use ipairs() instead?
result = v
break
end
Run Code Online (Sandbox Code Playgroud) 有没有办法按照下面的表格以与写入的顺序相同的方式循环一个表格?
local tbl = {
["hello"] = 1,
[2] = 2,
[50] = 3,
["bye"] = 4,
[200] = 5
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,当我使用"成对"时,每次执行代码时我都会得到不同的顺序......
我正在寻找这样的东西:
function get_keys(tbl)
local rtable = {}
for k,v in pairs(tbl) do
table.insert(rtable, k)
end
return rtable
end
local keys_of_tbl = get_keys(tbl)
for i = 1, table.getn(keys_of_tbl) do
--Do something with: tbl[keys_of_tbl[i]]
end
Run Code Online (Sandbox Code Playgroud)
但是因为函数"get_keys"再次基于"成对",它将无法工作......
问题来源于http://tylerneylon.com/a/learn-lua/ 教程包含代码:
Dog = {dog1 = 'original dog class'}
function Dog.new(self, ... )
newObj = {sound = 'woof'}
self.__index = self
return setmetatable(newObj, self)
end
function Dog.makeSound(self, ... )
print('I say' .. self.sound)
end
print('Dog=', Dog)
print('Dog.metatable=', getmetatable(Dog)) -- this will output nothing
myDog = Dog.new(Dog)
print('\nmyDog=', myDog)
print('myDog.metatable=', getmetatable(myDog))
myDog.makeSound(myDog)
Run Code Online (Sandbox Code Playgroud)
这是教程中上述代码的结果:
wirelessprvnat-172-17-106-141:Programming frankhe$ th test2.lua
Dog= {
makeSound : function: 0x0a6cec20
dog1 : "original dog class"
new : function: 0x0a6cec00
}
Dog.metatable= nil
myDog= {
sound : "woof" …Run Code Online (Sandbox Code Playgroud) 假设我想存储一个元素列表。包括一些零值。值的位置很重要,我需要表示列表中给定位置没有值。
这里有一个问题:
a = {1,2,3,nil,4}
for k,v in ipairs(a) do
print(k,v)
end
print(a[4])
print(a[5])
Run Code Online (Sandbox Code Playgroud)
for 循环只会打印元素 1,2 和 3。它在 nil 处停止。第一个打印语句打印 nil,但我不确定它是否实际存储在表中。(谁知道?)第二个打印语句按预期打印 4。
那么问题来了:如何在表中表示元素列表,并有效地遍历它们?鉴于上述条件,例如头寸是重要的,并且一些头寸是“空的”。换句话说:没有价值,但在那个位置没有那个价值是有意义的。
继续学习Lua。
我编写了一个函数,该函数从每一行中删除第一句话,并将结果作为修改后的行表返回,其中删除了第一句话。奇怪的是,table.insert在这样的函数中表现得很奇怪。
function mypackage.remove_first(table_of_lines)
local lns = table_of_lines
local new_lns = {}
for i=1,#lns do
table.insert(new_lns,string.gsub(lns[i],"^[^.]+. ","",1))
end
return new_lns
end
Run Code Online (Sandbox Code Playgroud)
没想到,这给了我以下错误。
[string "function mypackage.remove_first(table_of_lines)..."]:5: bad argument #2 to 'insert' (number expected, got string)
Run Code Online (Sandbox Code Playgroud)
为什么首先是“预期数字”?
来自table.insert文档
在列表中的位置 pos 处插入元素值,向上移动元素 list[pos], list[pos+1], ..., list[#list]。pos 的默认值为#list+1,因此调用 table.insert(t,x) 会在列表 t 的末尾插入 x。
没有提及 的类型要求table.insert。好的,我决定修改示例。
function mypackage.remove_first(table_of_lines)
local lns = table_of_lines
local new_lns = {}
for i=1,#lns do
local nofirst = string.gsub(lns[i],"^[^.]+. ","",1)
table.insert(new_lns,nofirst)
end
return new_lns
end …Run Code Online (Sandbox Code Playgroud)