You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua中如何通过字符串类型的属性名访问自定义类实例的属性值

Lua动态访问对象属性解决方案

核心语法修正

你遇到的第一个问题属于Lua基础语法范畴:

  • 点语法actual.name是固定访问对象的name字段,要通过变量的值动态指定访问的属性名,必须使用方括号语法:actual[name]。如果name变量的值是"material",该写法就等价于actual.material。

现有代码隐藏问题修复

你当前的代码还有两处配置错误,会导致即使改了语法也无法正常获取属性值:

  1. 私有属性未开放访问权限
    你调用make_proxy时没有传最后一个is_expose_private参数,默认值为false,此时属性查找的fallback是Feeds类表,而你所有初始化的参数都存在私有表rv里,自然找不到。需要把构造函数里的返回行修改为:
return make_proxy(Feeds, rv, Feeds_getters, Feeds_setters, true)

把最后一个参数设为true,开放私有表的访问权限。

  1. 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
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:36:04