Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reference 在将元表与Lua一起使用时,是否有一种方法可以让我确定是设置值还是检索值?_Reference_Lua_Metatable - Fatal编程技术网

Reference 在将元表与Lua一起使用时,是否有一种方法可以让我确定是设置值还是检索值?

Reference 在将元表与Lua一起使用时,是否有一种方法可以让我确定是设置值还是检索值?,reference,lua,metatable,Reference,Lua,Metatable,我已经在脚本中设置了一个“psuedooop”系统,可以更好地与应用程序中的用户数据进行交互。我的系统运行得非常好,除了它不传递引用,而是传递值。因此,如果我说: World.Body.Parent=World.Body2 实际上什么也没有发生,因为它从未将主体的父对象设置为另一个主体。相反,它有点简化为: World=World.Body2 (因为World是Body的父对象,所以返回它)。现在,如果我这样做,另一方面: 打印(World.Body.Parent.Type) ==>World

我已经在脚本中设置了一个“psuedooop”系统,可以更好地与应用程序中的用户数据进行交互。我的系统运行得非常好,除了它不传递引用,而是传递值。因此,如果我说:

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
方法或任何最简单的方法。