0

我在脚本中设置了一个“psuedo-oop”系统,让我可以更好地与应用程序中的 UserData 进行交互。我的系统工作得非常好,只是它不传递引用,而是传递值。因此,如果我这样说:

World.Body.Parent=World.Body2

实际上什么都没有发生,因为它实际上从未将Bodys 父级设置为另一个主体。相反,它有点简化为:

World=World.Body2

(因为它是返回World的父级Body)。现在,如果我做这样的事情,另一方面:

print(World.Body.Parent.Type)

==>World

因为它正确地获得了World对象(作为 的父级Body)。

现在考虑到这一切,是否有某种方法可以确保它通过引用传递而不是实际发送对象?任何想法,将不胜感激!

这是我正在使用的相关源代码:

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)
4

1 回答 1

2

__index 元方法仅在访问属性时被调用。为了实现自定义设置器,您还需要定义__newindex元方法。您可以在我链接到的 Lua 手册部分找到更多信息。

也就是说,如果我是你,我会再次考虑是否真的需要所有这些代理表复杂性。对于您可能没有涵盖的小角落案例之一的示例,除非您也添加 __ipairs 和 __pairs 元方法,否则使用对和 ipairs 迭代您的环境将失败。

于 2012-07-29T04:53:05.943 回答