从Lua的参考手册:https://www.lua.org/manual/5.3/manual.html#3.4.9
表构造器是创建表的表达式。每次评估构造函数时,都会创建一个新表。构造函数可以是 ,用于创建空表或创建表并初始化其字段的某些 。对构造的一般语法
tableconstructor ::= ‘{’ [fieldlist] ‘}’
fieldlist ::= field {fieldsep field} [fieldsep]
field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
fieldsep ::= ‘,’ | ‘;’
形式[EXP1] = EXP2中的每一个字段添加到新的表中的条目与 键EXP1和值EXP2。表单name = exp的字段为 ,等效于[“name”] = exp。最后,表单exp的字段为 ,等同于[i] = exp,其中i是连续的整数,从1开始 ,其他格式的字段不影响此计数。
正如你看到类似
method_map = {'idea_one' : party_animal:dance}
是不可能的,因为它为表构造无效语法。
替换:with =并移除“'使其成为有效的表达式。
method_map = {idea_one = party_animal:舞蹈}将避免该错误消息
标准输入:2: '}' 预期(以关闭 '{' 在第1行)邻近 ':'
但是你会看到关于缺少函数参数的另一个错误信息。
这是因为冒号操作符只对函数调用和定义有效。不适用于您实际想要执行的表格元素索引。
method_map = {idea_one = party_animal.dance}
不会导致任何错误。
当然,你不能通过自己访问party_animal。
我们该如何做到这一点?调用method_map:dance()
将自引用method_map。
但是,如果我们使用语法糖用冒号运算符, 写
method_map = {idea_one = function() return party_animal.dance(party_animal) end}
或等值
method_map = {idea_one = function() return party_animal:dance() end}
我们终于得到我们想要的东西。
现在自我将把party_animal如果我们调用method_map:dance()
method_map [1] [2]。 method_map [1]为零,因此你不能索引method_map [2]。即使method_map [1]是一个表,method_map [1] [2]也是零,你也不能调用nil值。 – Piglet
这是由于我使用错误的表格语法? – Matt
@MattDeacalionStevens不,这是因为您在创建表格时尝试使用字符串键并尝试使用数字键访问值。 'table [1]'尝试访问使用'table [1] = foo'或'table = {foo}'定义的键。总之,如果你省略'{}'中的键,那么所有的值将被编号为从* 1 *开始的数字。 'table = {“a”,“b”,“c”}'将导致'table [1] ==“a”'。 – Green