5

我正在尝试更改我在此视频中找到的类示例,以使其更易于使用。希望我的评论能够很好地解释我正在努力完成的工作。我遇到的问题是,当我尝试使用数据表时,它给了我这个错误: lua: class example.lua:7: attempt to index field 'data' (a nil value)

我假设这意味着数组没有正确传递给函数,但我不知道为什么。我是 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);
4

3 回答 3

5

您没有创建object.data表——Lua 中的每个表都需要初始化:

local object = {}
local object.data = {}

或者

local object = { data = {} }

但是,除非您修复 getData 函数,否则您的示例将无法按预期方式工作:

function object:getData(choice) 
  return self.data[choice]
end

最后,这是 Lua,因此您的代码中不需要任何内容;​​:P。

于 2013-01-02T08:46:23.410 回答
4

如果你想object保存数据,你可能打算写

object[data[i]] = data[i + 1];

代替

object.data[i] = data[i + 1];

这样做打印的结果是64

于 2013-01-02T15:38:05.927 回答
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 了解得越多,你就会越喜欢它。它真的是一门很棒的语言,有很多有趣的小功能。快乐编码!

于 2013-01-02T20:31:52.803 回答