【问题标题】:Passing array as function parameter in Lua?在Lua中将数组作为函数参数传递?
【发布时间】:2012-12-16 15:19:45
【问题描述】:

我正在尝试更改我在this video 中找到的类示例,使其更易于使用。希望我的 cmets 能很好地解释我想要完成的工作。我遇到的问题是,当我尝试使用数据表时,它给了我这个错误: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);

【问题讨论】:

    标签: arrays class function parameters lua


    【解决方案1】:

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

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

    或

    local object = { data = {} }
    

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

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

    最后,这是 Lua,所以您的代码中不需要任何 ;:P。

    【讨论】:

    • 哈哈,我知道了;没必要,我刚开始用C编程,我的老师对这些东西很严格,所以有它们很舒服。 :P
    • 我一开始所做的工作(减去我犯的 mkluwe 指出的愚蠢错误)的代码比这更少,并且不需要再次保存数据表。有什么理由我应该这样做而不是另一种方式?
    【解决方案2】:

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

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

    而不是

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

    这样做打印的结果是64。

    【讨论】:

    • 啊,这是一个如此简单的错误......虽然我想通常是这样的。
    • 是的,而且并不少见。我不时会输入t.a 而不是t[ a ]。
    【解决方案3】:

    正如其他人所说,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 了解得越多,你就会越喜欢它。它真的是一门很棒的语言,有很多有趣的小功能。编码愉快!

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 2013-06-03
      • 2013-07-13
      • 2017-07-11
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2021-02-23
      • 2010-10-01
      相关资源
      最近更新 更多