Lua中如何通过字符串类型的属性名访问自定义类实例的属性值
Lua动态访问对象属性解决方案
核心语法修正
你遇到的第一个问题属于Lua基础语法范畴:
- 点语法
actual.name是固定访问对象的name字段,要通过变量的值动态指定访问的属性名,必须使用方括号语法:actual[name]。如果name变量的值是"material",该写法就等价于actual.material。
现有代码隐藏问题修复
你当前的代码还有两处配置错误,会导致即使改了语法也无法正常获取属性值:
- 私有属性未开放访问权限
你调用make_proxy时没有传最后一个is_expose_private参数,默认值为false,此时属性查找的fallback是Feeds类表,而你所有初始化的参数都存在私有表rv里,自然找不到。需要把构造函数里的返回行修改为:
return make_proxy(Feeds, rv, Feeds_getters, Feeds_setters, true)
把最后一个参数设为true,开放私有表的访问权限。
- setter变量名拼写错误
你定义的setter表叫Feeds_attribute_setters,但传入make_proxy的第三个参数是Feeds_setters,这个变量未定义,会导致setter功能失效,两种修改方式二选一即可:
-- 方式1:修改传入的setter参数为你实际定义的表名 return make_proxy(Feeds, rv, Feeds_getters, Feeds_attribute_setters, true) -- 方式2:把setter表的变量名改为Feeds_setters local Feeds_setters = { material = function(self, material) local priv = getmetatable(self).priv assert(type(material) == "string") priv.material = material end }
- getter函数参数冗余
你定义的Feeds_getters里的b函数多了一个无用的value参数,getter只会接收self一个参数,修改为:
local Feeds_getters = { b = function(self) local priv = getmetatable(self).priv return priv.a end }
最终测试写法
修改完成后,你就可以用动态变量正常访问属性了:
actual = Feeds:new(arg) local name = "material" print("name= " .. actual[name]) -- 会正确输出material对应的值,比如"MDF"
内容的提问来源于stack exchange,提问作者Chelmite
相关产品推荐
相关产品推荐

