lua - 为什么第一个示例构造函数在 `self` 上设置 `__index`?
问题描述
我刚刚开始研究 Lua,并且正在研究"classes" 的介绍性 Lua 示例。
Account = {balance = 0}
function Account:new (o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
我不明白为什么构造函数不仅仅是
function Account:new (o)
o = o or {}
setmetatable(o, {__index = self})
return o
end
对于理解这一点,我将不胜感激。
编辑:
@Egor 观察到第二种方法会创建太多的元表。好的,我明白了(事实上,这很明显)。但是第一种方法仍然感觉很奇怪(例如,它反复设置__index
on Account
)。也许这样的事情会同时满足这两种反对意见?
Account = {balance = 0}
Account_meta = {__index = Account}
function Account:new (o)
o = o or {}
setmetatable(o, Account_meta)
return o
end
解决方案
我相信这种方法的唯一原因是将它与下一节中的继承联系起来。
那里的继承实现用SpecialAccount
s创建原型,然后用s 创建SpecialAccount = Account:new()
新实例。SpecialAccount
instance = SpecialAccount:new()
如果我们希望这种方法能够正常工作,则必须将这两个调用之一设置SpecialAccount.__index
为SpecialAccount
. 假设我们只想__index
设置原型/元表/类,它必须是第二个。这需要我们在每个对象创建过程中重复一次分配,但我想这并不是为了举例而被认为是重要的。
推荐阅读
- windows - 如何通知用户从 Windows 批处理发送的数据?
- swift - 何时调用计算属性的 modify 方法,它的作用是什么?
- loops - For 循环逻辑通过查看未来点值来标记一系列数据点的趋势类型
- .net-core - Cronjob 不断减少可用磁盘空间
- csv - 如何将 CSV 数据从 Google Drive/Google Sheets 正确导入 BigQuery
- python - 如何在python中提取同一类中的多个链接?
- angular - 如何更改悬停颜色,如显示的屏幕截图所示?
- java - 处理文件上传在 Primefaces 6.2 中不起作用
- html - 如何最小化 HTML 表格单元格的顶部和底部“填充”?
- html - SVG元素的CSS背景