Reference 在将元表与Lua一起使用时,是否有一种方法可以让我确定是设置值还是检索值?
我已经在脚本中设置了一个“psuedooop”系统,可以更好地与应用程序中的用户数据进行交互。我的系统运行得非常好,除了它不传递引用,而是传递值。因此,如果我说:Reference 在将元表与Lua一起使用时,是否有一种方法可以让我确定是设置值还是检索值?,reference,lua,metatable,Reference,Lua,Metatable,我已经在脚本中设置了一个“psuedooop”系统,可以更好地与应用程序中的用户数据进行交互。我的系统运行得非常好,除了它不传递引用,而是传递值。因此,如果我说: World.Body.Parent=World.Body2 实际上什么也没有发生,因为它从未将主体的父对象设置为另一个主体。相反,它有点简化为: World=World.Body2 (因为World是Body的父对象,所以返回它)。现在,如果我这样做,另一方面: 打印(World.Body.Parent.Type) ==>World
World.Body.Parent=World.Body2
实际上什么也没有发生,因为它从未将主体的父对象设置为另一个主体。相反,它有点简化为:
World=World.Body2
(因为World
是Body
的父对象,所以返回它)。现在,如果我这样做,另一方面:
打印(World.Body.Parent.Type)
==>World
因为它正确地获得了世界
对象(作为主体
的父对象)
考虑到这一点,有没有办法确保更多地通过引用传递,而不是实际发送对象?任何想法都将不胜感激
以下是我正在使用的相关源代码:
local target=_G
function AddService(service)
Blank=(function(...) return end)
CreateTemporaryIndex=(function(obj)
local env_meta={
__index=(function(this, key)
if obj[key]~=nil and obj[key]~=key then
if type(obj[key]) ~= "userdata" then
return obj[key]
else
local r,i=pcall(function() Blank(obj[key].Type) end)
if r then
return CreateTemporaryIndex(obj[key])
else
return (function(...) local arg={...} table.remove(arg,1) return obj[key](obj,unpack(arg)) end)
end
end
else
local ofObj=obj:Child(key)
if ofObj~=nil then
return CreateTemporaryIndex(ofObj)
end
end
return nil
end)
}
local nRe={}
setmetatable(nRe,env_meta)
return nRe
end)
target[service.Name]=CreateTemporaryIndex(service)
end
AddService(__Environment.World)
AddService(__Environment.Players)
AddService(__Environment.Lighting)
AddService(__Environment.Environment)
索引元方法。为了实现自定义setter,您还需要定义\uu newindex元方法。您可以在我链接到的Lua手册部分找到更多信息
也就是说,如果我是你,我会再次考虑是否真的需要所有这些复杂的代理表。例如,您可能没有介绍的一种小情况,除非您也添加uu-ipair和uu-pairs元方法,否则使用pairs和ipair在您的环境中进行迭代将失败。除了数字以外的所有内容都在Lua中通过引用传递。传递值的唯一方法是在传递之前显式地复制和对象?我现在要继续检查您的解决方案,但不管怎样,我也愿意接受其他选项。@Dlamk:我指的是一个无聊的解决方案,其中有大量的get
和set
方法或任何最简单的方法。