在Lua中将数组作为函数参数传递?

我试图修改我在这个视频中找到的类示例,使其更加简洁易用。希望我的注释足够清楚地解释了我想要实现的目标。我遇到的问题是,当我尝试使用数据表时,它会给我这个错误: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);
点赞
用户233522
用户233522

你没有创建 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-02 08:46:23
用户199201
用户199201

如果你想让 object 存储数据,你可能想要写成:

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

而不是

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

这样做会输出 64

2013-01-02 15:38:05
用户1942787
用户1942787

像其他人说的,object.data需要初始化,并且for循环和getData中存在缺陷。另外,虽然这不是一个bug,但是你传递奇数作为键和偶数作为值的系统在基于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-02 20:31:52