Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 关于Lua中的冒号算子_Oop_Lua_Lua Table - Fatal编程技术网

Oop 关于Lua中的冒号算子

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() @于浩直接回答。这是更多的背景 冒号运

为什么这段代码失败(尝试调用方法'sort'(一个nil值))

当这起作用时

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中)最初将标准字符串表作为_索引元方法。