通过元方法__index、__newindex、rawset,我们可以实现属性的Get/Set访问,类似于C#:
public string name;
public string Name
{
get => name;
set => name = value;
}
方法一:将属性数据存在元表中
local meta = { name = "meta" }
meta.__index = function(self, key)
print("Get Key = " .. tostring(key))
return meta[key]
end
meta.__newindex = function(self, key, value)
print("Set Key = " .. tostring(key) .. " , value = " .. tostring(value))
meta[key] = value
end
local table = {}
setmetatable(table, meta)
print("—— 1 ——")
print(table.name)
print("—— 2 ——")
table.name = "table"
print("—— 3 ——")
print(table.name)
---输出结果:
-- —— 1 ——
-- Get Key = name
-- meta
-- —— 2 ——
-- Set Key = name , value = table
-- —— 3 ——
-- Get Key = name
-- table
__index 可视为该table中所有属性的Get方法,通过参数Key区分不同的属性;
__newindex 可视为该table中所有属性的Set方法,通过参数Key区分不同的属性;
该方法的局限性在于,子表不得绕过元方法对属性进行修改(比如通过 rawset 方法),这是为了防止:因为子表有对应的属性,而无法触发到元表的 __index 方法
这也意味着,之后对于子表所有的属性获取与修改,都会反馈到元表上,子表永远都会是个空的table
方法二:将属性数据存在子表中
local meta = {
__index = function(self, key)
print("Get Key = " .. tostring(key))
return self._TEMP_META_DATA_[key]
end,
__newindex = function(self, key, value)
print("Set Key = " .. tostring(key) .. " , value = " .. tostring(value))
rawset(self._TEMP_META_DATA_, key, value)
end,
}
local table = {}
table._TEMP_META_DATA_ = {}
setmetatable(table, meta)
print("—— 1 ——")
print(table.name)
print("—— 2 ——")
table.name = 5
print("—— 3 ——")
print(table.name)
---输出结果:
-- —— 1 ——
-- Get Key = name
--
-- —— 2 ——
-- Set Key = name , value = 5
-- —— 3 ——
-- Get Key = name
-- 5
该方法的优势在于,对子表的修改都能反馈到子表上,并由此可以衍生许多进阶写法文章来源:https://www.toymoban.com/news/detail-846271.html
未完待续……文章来源地址https://www.toymoban.com/news/detail-846271.html
到了这里,关于Lua 通过元方法简单实现属性Get/Set访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!