为什么可以将 __index 设置为表

索引元方法可以设置为表。据我所知

foo.__index = function(self, k)
    return bar[k]
end

foo.__index = bar

是一样的。为什么在这种情况下允许以这种方式声明函数呢?

点赞
用户5287638
用户5287638

这不是一个函数声明 - 将一个表分配给__index只是使用您描述的函数的快捷方式。

来自Lua编程(Lua5.0版,但是该语言的这部分内容没有改变):

对于继承,使用__index元表的使用非常普遍,因此Lua提供了一种快捷方式。尽管名称是这样,但是__index元方法不需要是一个函数:它可以是一个表。当它是一个函数时,Lua通过将该表和缺少的键作为其参数来调用它。当它是一个表时,Lua在那个表中重新对访问进行操作。

它不像你分配的表会自动成为函数。 type(foo.__index)仍将返回table,您仍然可以使用与其他表一样的方式执行其他操作,例如使用pairsnext等。

2017-06-02 04:46:40