Lua 5.1代码报错:调用表值‘position’的原因及解决方法咨询
Lua 5.1代码错误分析与修复(第36行报错)
错误原因
报错信息attempt to call method 'position' (a table value)的核心是:你尝试调用一个table类型的值,但它并不是可执行的函数。
问题根源
你在Transform类中出现了命名冲突:
- 在
Transform:new方法里,给每个实例都定义了名为position的table字段(存储Vector3f对象); - 同时又给
Transform元表定义了同名的position方法。
Lua的属性查找规则是:优先查找实例自身的键,找不到才会去元表的__index中匹配方法。所以执行transform:position(10,20,30)时,Lua先找到实例自身的position字段(那个Vector3f对象),而非你定义的方法,自然无法调用。
修复方法
最直接的解决方式是修改方法名,避免和实例字段重名,比如将方法改为setPosition:
Vector3f = {} Vector3f.__index = Vector3f function Vector3f:new(x, y, z) local vector = {x = x or 0, y = y or 0, z = z or 0} setmetatable(vector, self) return vector end Transform = {} Transform.__index = Transform function Transform:new(position, rotation, scale) local transform = { position = position or Vector3f:new(0, 0, 0), rotation = rotation or Vector3f:new(0, 0, 0), scale = scale or Vector3f:new(0, 0, 0) } setmetatable(transform, self) return transform end -- 修改方法名为setPosition function Transform:setPosition(x, y, z) self.position.x = x or self.position.x self.position.y = y or self.position.y self.position.z = z or self.position.z end local pos = Vector3f:new(1, 2, 3) local rot = Vector3f:new(4, 5, 6) local sca = Vector3f:new(7, 8, 9) local transform = Transform:new(pos, rot, sca) print("X: " .. transform.position.x .. " Y: " .. transform.position.y .. " Z: " .. transform.position.z) print("X: " .. transform.rotation.x .. " Y: " .. transform.rotation.y .. " Z: " .. transform.rotation.z) print("X: " .. transform.scale.x .. " Y: " .. transform.scale.y .. " Z: " .. transform.scale.z) -- 调用修改后的方法 transform:setPosition(10, 20, 30) print("X: " .. transform.position.x .. " Y: " .. transform.position.y .. " Z: " .. transform.position.z)
也可以选择修改实例字段的名称,但这种方式会影响所有使用transform.position的代码,不如修改方法名高效。
内容的提问来源于stack exchange,提问作者MRXIT
相关产品推荐
相关产品推荐

