我正在尝试更改我在this video中找到的类示例,以使其更加简化使用。希望我的评论可以解释我正在努力完成的事情。我遇到的问题是,当我尝试使用数据表时,它给出了我的错误:lua:class example.lua:7:尝试索引字段'data'(零值)
我假设这意味着数组没有正确传递给函数,但我不知道为什么。我是Lua的初学者。
这就是我所拥有的:
local enemy = {}; --enemy class table
function enemy:New(data)
local object = {}; --table to store all of data within class
local len = # data --get length of passed table
for i = 1, len, 2 do --loop to input all data from passed table into object table
object.data[i] = data[i + 1];
end
function object:getData(choice) --function that allows us to retrieve data from the class
return self[choice];
end
return object; --return class data table so we can create objects using the class
end
local monsterdata = {"name", "monster", "x", 64, "y", 128, "hp", 4}; --table containing data of monster. keys are odd numbered, values to those keys are even numbered
local monster = enemy:New(monsterdata); --create a object using the class
local test = monster:getData("x"); --set variable to a value with the getData function
print(test);
答案 0 :(得分:5)
您没有创建object.data
表 - Lua中的每个表都需要初始化:
local object = {}
local object.data = {}
或
local object = { data = {} }
但是,除非修复getData函数,否则您的示例将无法按预期方式工作:
function object:getData(choice)
return self.data[choice]
end
最后,这是Lua,因此您的代码中不需要任何;
:P。
答案 1 :(得分:4)
如果您希望object
保存数据,则可能需要编写
object[data[i]] = data[i + 1];
而不是
object.data[i] = data[i + 1];
打印结果为64
。
答案 2 :(得分:2)
与其他人一样,object.data
需要初始化,for
循环和getData
存在缺陷。此外,虽然它不是一个错误的错误,你的系统将键作为奇数和值传递为偶数是一种非常好的方法,在基于C的语言中,没有关联数组/字典/表文字,但在Lua中,成语是
{keyname = value, keyname = value, ...}
,如果表格跨越多行
{
keyname = value;
keyname = value;
keyname = value;
...
}
因此,在您的情况下,monsterdata
可能只是
{
name = "monster";
x = 64;
y = 128;
hp = 4;
}
您可以完全删除for
循环
注意:您只能以这种方式表示字符串键。对于其他类型的键,例如数字,布尔值,甚至函数和其他表格,请在[
方括号]
中围绕键。例如,如果您想要一个mynot
表,将布尔值映射到它们的对立面,您可以使用:
{
[true] = false;
[false] = true;
}
或者,如果您想将一组函数映射到其库中
{
[print] = "standard";
[os.execute] = "standard os";
[math.sin] = "standard math";
[function() print "a user function" end] = "me!";
}
我认为你越了解Lua,你就会越喜欢它。它真的是一种很棒的语言,有很多有趣的小功能。快乐的编码!