Lua中不同对象如何设置不一致的元表?
- 内容介绍
- 文章标签
- 相关推荐
本文共计729个文字,预计阅读时间需要3分钟。
我无法理解为什么这些示例中的 `__index` 元方法的行为存在差异:`A+%3D+setmetatable%7B%7D%2CA%7D`。下面是简化后的代码内容:
luaA=setmetatable({}, A)A:speak=function() print(I'm an A) end
An_A=AAn_A:speak()
这段代码尝试定义一个名为 `A` 的表,并使用 `setmetatable` 将它作为自己的元表。然后,在 `A` 表中定义了一个名为 `speak` 的方法。接着,创建了一个名为 `An_A` 的变量,它实际上是 `A` 的别名。调用 `An_A:speak()` 应该输出 I'm an A。
代码中并没有明显的错误,所以它应该能够正常工作。如果存在错误,可能是由于 Lua 脚本的其他部分或者上下文环境导致的。请确保整个脚本环境正确,并且没有其他代码干扰这个简单的示例。
我无法理解为什么这些示例之间的__index元方法的行为存在差异:A = { __index = A } function A:speak() print("I'm an A") end An_A = setmetatable({},A) An_A:speak()
将引发以下错误:lua:l.lua:8:尝试调用方法’speak'(零值)
同时
B = { __index = function(t,key) return B[key] end } function B:speak() print("I'm an B") end An_B = setmetatable({},B) An_B:speak()
将按预期执行,输出我是B.
在试图理解为什么会这样的情况下,我阅读了PiL的this部分.它指出:
The use of the __index metamethod for inheritance is so common that
Lua provides a shortcut. Despite the name, the __index metamethod does
not need to be a function: It can be a table, instead. When it is a
function, Lua calls it with the table and the absent key as its
arguments. When it is a table, Lua redoes the access in that table.
我对此的理解是,在涉及’A’的片段中,__ index = A导致访问在表A中完成(根据上面引用的加粗segmenet).如果是这种情况,我不明白为什么找不到与“说话”键相关的功能.为了尝试修复此问题,我决定在B片段中实现函数方法,该片段返回与B中的键相关联的值,并且它起作用.当然__index = A和(改编自B)__ index = function(t,key)返回A [key] end具有相同的效果.
任何澄清将不胜感激.
你的第一个例子中发生的是A .__ index == nil.当你在第一行创建’A’时:A = { __index = A }
赋值’A’的右侧评估为nil,因为此时它尚不存在.因此,稍后在此处设置metatable时:
An_A = setmetatable({},A)
它真的最终做了类似于此的事情:
An_A = setmetatable({}, {__index = nil} )
为了让它以你想要的方式工作,你必须确保__index不是零.例如,在表构造之后分配它:
A = {} A.__index = A function A:speak() print("I'm an A") end An_A = setmetatable({},A) An_A:speak() --> outputs I'm an A
本文共计729个文字,预计阅读时间需要3分钟。
我无法理解为什么这些示例中的 `__index` 元方法的行为存在差异:`A+%3D+setmetatable%7B%7D%2CA%7D`。下面是简化后的代码内容:
luaA=setmetatable({}, A)A:speak=function() print(I'm an A) end
An_A=AAn_A:speak()
这段代码尝试定义一个名为 `A` 的表,并使用 `setmetatable` 将它作为自己的元表。然后,在 `A` 表中定义了一个名为 `speak` 的方法。接着,创建了一个名为 `An_A` 的变量,它实际上是 `A` 的别名。调用 `An_A:speak()` 应该输出 I'm an A。
代码中并没有明显的错误,所以它应该能够正常工作。如果存在错误,可能是由于 Lua 脚本的其他部分或者上下文环境导致的。请确保整个脚本环境正确,并且没有其他代码干扰这个简单的示例。
我无法理解为什么这些示例之间的__index元方法的行为存在差异:A = { __index = A } function A:speak() print("I'm an A") end An_A = setmetatable({},A) An_A:speak()
将引发以下错误:lua:l.lua:8:尝试调用方法’speak'(零值)
同时
B = { __index = function(t,key) return B[key] end } function B:speak() print("I'm an B") end An_B = setmetatable({},B) An_B:speak()
将按预期执行,输出我是B.
在试图理解为什么会这样的情况下,我阅读了PiL的this部分.它指出:
The use of the __index metamethod for inheritance is so common that
Lua provides a shortcut. Despite the name, the __index metamethod does
not need to be a function: It can be a table, instead. When it is a
function, Lua calls it with the table and the absent key as its
arguments. When it is a table, Lua redoes the access in that table.
我对此的理解是,在涉及’A’的片段中,__ index = A导致访问在表A中完成(根据上面引用的加粗segmenet).如果是这种情况,我不明白为什么找不到与“说话”键相关的功能.为了尝试修复此问题,我决定在B片段中实现函数方法,该片段返回与B中的键相关联的值,并且它起作用.当然__index = A和(改编自B)__ index = function(t,key)返回A [key] end具有相同的效果.
任何澄清将不胜感激.
你的第一个例子中发生的是A .__ index == nil.当你在第一行创建’A’时:A = { __index = A }
赋值’A’的右侧评估为nil,因为此时它尚不存在.因此,稍后在此处设置metatable时:
An_A = setmetatable({},A)
它真的最终做了类似于此的事情:
An_A = setmetatable({}, {__index = nil} )
为了让它以你想要的方式工作,你必须确保__index不是零.例如,在表构造之后分配它:
A = {} A.__index = A function A:speak() print("I'm an A") end An_A = setmetatable({},A) An_A:speak() --> outputs I'm an A

