- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
item = {y = 21}
function item:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function item:Run()
print("item running")
end
berry = item:new{x = 52}
function berry:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function berry:Run()
print("berry is running")
self.__index:Run()
end
berry:new{b = 32}:Run()
当它应该打印“berry is running”后跟“item running”时,输出会无限打印“berry is running”。如果我将 self.__index
更改为 self.__index.__index
甚至更改为 self.__index.__index.__index
,输出仍会无限打印“浆果正在运行”。我该如何纠正这个问题?任何帮助将不胜感激
最佳答案
您已经覆盖了berry
中item
的Run
函数,这使得它更难到达。此覆盖会导致无限循环,因为 self.__index
是对 self
的引用,它是一个 berry
。现在 Run
在 berry 中定义 __index
当 berry
被 Run
索引时将不再被调用
所以你的 berry:Run
函数本质上是
function berry:Run()
print("berry is running")
berry:Run()
end
我建议您更改berry:Run
函数,并在其中专门调用item.Run
:
function berry:Run()
print("berry is running")
item.Run(self) -- specifically call item.Run and pass it self.
end
这将为您提供所需的输出:
berry is running
item running
或者,您可以通过在运行前在 berry 中定义它来保留 item:Run
函数:
berry.ParentRun. = berry.Run -- this will cause __index to run and get item:Run
function berry:Run() -- This now defines berry.Run. now __index will no longer run for berry.Run
print("berry is running")
self:ParentRun()
end
奖金说明:
你看到的原因
berry is running
berry is running
item running
评论中的建议是因为运行顺序是
object:Run() -- this calls berry passing the self of object
打印我们的第一个浆果正在运行
现在我们获取那个对象的元表,它是 berry 并调用它运行
berry:Run()
打印我们的第二个浆果正在运行
最后我们得到 berry 的元表,它是 item 并调用它运行
item:Run()
打印项目运行
关于oop - 为什么.__index只返回子类的函数而不返回基类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59544441/
据我所知,lua 不会调用 __index 除非在表中找不到该键,所以我有该代码并且它在 __index 部分遭受无限递归,我没有得到因为 __index 函数中使用的两个值已经存在于表中!? 这基本
我正在用 Lua 学习面向对象的编程。我无法理解在实例的 __index 字段中分配表和为实例设置元表之间的功能差异。我查看了官方 Lua 的引用手册,但我并没有完全掌握其中的区别。例如,要创建 Ac
我的自制 OO 设计遇到了这个特殊问题: Entity = {} function Entity:new(o) o = o or {} return setmetatable(o, {__in
我之前问过为什么 Lua 没有找到我的元表方法,并通过设置 __index 被告知。到我的元表,它会解决这个问题,所以我假设一个方法在调用时是通过元表中的索引搜索的,但是我现在遇到了一个问题,我需要使
索引元方法可以设置为与表相同。据我所知 foo.__index = function(self, k) return bar[k] end 和 foo.__index = bar 是一样的。为
在 Lua 中,the __index metamethod可以是函数或表引用。所以下面的结构是等价的: foo = { a=1, b=2, c=3 } bar = setmetatable({},
我已经实现了自己的类(class)系统,但遇到了 __tostring 的问题;我怀疑其他元方法可能会发生类似的问题,但我还没有尝试过。 (绕道而行:每个类都有一个 __classDict 属性,包含
我注意到一个 lua 模块设置返回表的 __index作为自己 local M = { _VERSION = "1.0.0" } M.__index = M function M.do() end
我正在尝试将函数用作元表 __index 以实现更大的灵 active ,但是当返回的值未分配给 Lua 端的某个变量时,它会崩溃。 这是 C++ 部分,它只是创建了一个表变量,其 __index 指
我对以下两种使用“.”的语法感到困惑 据我了解,当键不存在于表中但存在于其元表中时,会调用 __index 。那么为什么列表表会调用__index,然后将自己赋值给list.__index呢? lis
我有一个 C++ 回调/仿函数系统的脚本,它可以使用字符串和/或变体调用任何“已注册”的 C++ 函数。 //REMOVED ERROR CHECKS AND ERRONEOUS STUFF FOR
我想在 Lua 中声明由 C++ 应用程序注册的全局元表。 我定义了元表和一些字段的 __index 元方法,但是当 lua 脚本访问已知字段时,总是在我的 C++ 应用程序中调用 __index。
例如: local my_table = { name = "my table" } local my_table_mt = {} function my_table_mt.__tostring(tb
我想在 Javascript 对象上定义一种行为,当引用的属性/方法不存在时,该行为就会启动。在 Lua 中,您可以使用元表和 __index & __newindex 方法来做到这一点。 --Lua
我是一名优秀的程序员,十分优秀!