Oop 关于Lua中的冒号算子
为什么这段代码失败(尝试调用方法'sort'(一个nil值)) 当这起作用时Oop 关于Lua中的冒号算子,oop,lua,lua-table,Oop,Lua,Lua Table,为什么这段代码失败(尝试调用方法'sort'(一个nil值)) 当这起作用时 th> table.sort(xyz) 因为默认情况下,包含用于操作标准库提供的表的通用函数的表不在表的元表中。事实上,除非明确指定,否则表没有元表 不过,您可以手动执行此操作: local xyz = {1,2,3} local mt = { __index = table} setmetatable(xyz, mt) xyz:insert(2) xyz:sort() @于浩直接回答。这是更多的背景 冒号运
th> table.sort(xyz)
因为默认情况下,包含用于操作标准库提供的表的通用函数的表不在表的元表中。事实上,除非明确指定,否则表没有元表
不过,您可以手动执行此操作:
local xyz = {1,2,3}
local mt = { __index = table}
setmetatable(xyz, mt)
xyz:insert(2)
xyz:sort()
@于浩直接回答。这是更多的背景 冒号运算符是索引运算符;它在左侧索引表达式的值,在右侧索引标识符(作为字符串类型的键)
expression:identifier(arg0, arg1, ...)
在概念上与
local lhs = expression
lhs.identifer(lhs, arg0, arg1, ...)
local lhs = expression
lhs["identifer"](lhs, arg0, arg1, ...)
在概念上与
local lhs = expression
lhs.identifer(lhs, arg0, arg1, ...)
local lhs = expression
lhs["identifer"](lhs, arg0, arg1, ...)
所以,你的问题与其说是关于冒号操作符,不如说是关于索引
在Lua中,索引表类型的值首先检查表字段中的键。如果找到,则返回值
如果没有,它将检查该表是否有一个可选的当前关联的元表,以及该表是否有一个键为“\uuu index”的值。如果未找到,索引结果为nil
。如果_索引字段的值是一个表,则该过程将在该表上重复。如果该值是一个函数,那么索引的结果就是调用该函数的返回值
在您的例子中,如@YuHao,您的表既没有“sort”字段也没有元表,因此索引结果是
nil
,导致尝试调用nil值的错误。(消息很好地表明您使用了冒号语法,表示它是一个“方法调用”。这是因为xyz
没有键/值对,其中键是“sort”
,值是一个函数<代码>表中有键/值对。尝试以下方法,让事情变得更清楚:
local xyz = {}
print(xyz.sort) -- prints nil
print(table.sort) -- prints function: 0xabcd1234
print(xyz:unpack())
,这是表方法的另一个很好的用法。这与字符串类型的值不同,字符串类型的值(在最新版本的Lua中)最初将标准字符串表作为_索引元方法。