gpt4 book ai didi

class - 在lua中支持 "recursive objects"

转载 作者:行者123 更新时间:2023-12-05 00:21:59 25 4
gpt4 key购买 nike

我对 lua 相当陌生,并且在类作业中遇到以下问题:

我们目前扩展 lua 以支持对象和继承。语法是

Class{'MyClass', 
attribute1 = String,
attribute2 = Number
}

Class{'MySubClass', MyClass,
attribute3 = Number
}

这工作得很好。真正的问题在于下一个任务:我们应该支持“递归类型”,这意味着像这样的调用
Class{'MyClass', attribute = MyClass}

应该产生一个与该类具有相同类型字段的类。当这个“类构造函数”被称为变量 MyClassnil ,这就是为什么参数表没有条目 attribute .如何访问这个属性?

我的第一个想法是使用某种 nil - 每次全局返回时返回的表 __index使用未设置的键调用。此 nil -table 应该表现得像正常 nil ,但可以在“类构造函数”中检查。这种方法的问题是类似 nil == unknown 的比较。 .这应该返回 true ,但作为 __eq nil 的元方法-table 永远不会被调用我们不能返回 true .

有没有我目前忽略的另一种方法?任何提示都非常感谢。

提前致谢。

编辑:
这里是“testfile”的相关部分。在类里面对代码进行评级的测试是另一个测试,稍后会发布。
three = 3
print( three == 3 , "Should be true")
print( unknown == nil , "Should be true" )

Class{'AClass', name = String, ref = AClass}
function AClass:write()
print("AClass:write(), name of AClass:", self.name)
end

aclass = AClass:create("A. Class")
aclass:write()

最佳答案

MyClass只是在全局表( _G )中查找,您可能会弄乱其元表的 __index返回一个新定义的 MyClass 对象(稍后您需要填写详细信息)。

然而,虽然可行,但这样的实现是

  • 非常不安全,因为您最终可能会得到一个未定义的类(或者更糟的是,您最终可能会无意中创建一个无限查找循环。相信我,我一直在那里)
  • 很难调试,因为每个 _G查找不存在的变量现在将返回一个新创建的类对象而不是 nil(这个问题可以通过要求类名以大写字符开头来减少)

  • 如果你走那条路,一定要覆盖 __newindex .

    关于class - 在lua中支持 "recursive objects",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30597404/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com