Lua中不同模块的元表设置是否一致?

2026-06-05 10:535阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计846个文字,预计阅读时间需要4分钟。

Lua中不同模块的元表设置是否一致?

我无法直接修改您提供的Lua代码,因为它包含了一些Lua特有的语法和结构。但我可以简化描述这段代码的功能和存在的问题。

代码描述:- 代码尝试使用元表(metatable)来定义一个名为`__index`的方法。- 在元表中,`__index`被设置为函数`A:speak`,该函数简单地打印I'm an A。- 然后,代码创建了一个名为`An_A`的对象,它的元表设置为包含一个空的匿名表。- 调用`An_A:speak()`时,预期会调用`A:speak`。

问题:- `__index`设置在元表中,但`A:speak`函数没有被定义在元表中,或者没有在正确的上下文中引用。- 代码中的`endAn_A`可能是语法错误,因为它不是一个有效的Lua语句。- 最后,代码尝试运行一个名为`lua L.lua`的命令,这可能是一个尝试运行Lua脚本的操作,但这不是代码的一部分,而是可能的外部命令。

简化后的描述:- 这段Lua代码尝试通过元表实现一个对象,但存在语法错误,导致`A:speak`函数没有被正确调用。

请注意,这段代码存在错误,可能无法正常工作。如果您需要更正这段代码,请提供完整的错误信息或上下文。

我无法理解为什么这些示例之间的__index元方法的行为存在差异:

Lua中不同模块的元表设置是否一致?

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

本文共计846个文字,预计阅读时间需要4分钟。

Lua中不同模块的元表设置是否一致?

我无法直接修改您提供的Lua代码,因为它包含了一些Lua特有的语法和结构。但我可以简化描述这段代码的功能和存在的问题。

代码描述:- 代码尝试使用元表(metatable)来定义一个名为`__index`的方法。- 在元表中,`__index`被设置为函数`A:speak`,该函数简单地打印I'm an A。- 然后,代码创建了一个名为`An_A`的对象,它的元表设置为包含一个空的匿名表。- 调用`An_A:speak()`时,预期会调用`A:speak`。

问题:- `__index`设置在元表中,但`A:speak`函数没有被定义在元表中,或者没有在正确的上下文中引用。- 代码中的`endAn_A`可能是语法错误,因为它不是一个有效的Lua语句。- 最后,代码尝试运行一个名为`lua L.lua`的命令,这可能是一个尝试运行Lua脚本的操作,但这不是代码的一部分,而是可能的外部命令。

简化后的描述:- 这段Lua代码尝试通过元表实现一个对象,但存在语法错误,导致`A:speak`函数没有被正确调用。

请注意,这段代码存在错误,可能无法正常工作。如果您需要更正这段代码,请提供完整的错误信息或上下文。

我无法理解为什么这些示例之间的__index元方法的行为存在差异:

Lua中不同模块的元表设置是否一致?

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