在 Lua 中使用元表时,有没有办法确定值是被设置还是被检索?

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

World.Body.Parent=World.Body2

实际上没有任何事情发生,因为它从未真正将Body 的父级设置为其他部位。相反,它有点简化为这个:

World=World.Body2

(因为WorldBody的父级,所以会返回它)。现在,如果我做这样的事情:

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)
点赞
用户90511
用户90511

__index 元方法仅在访问属性时调用。为了实现自定义的 setter,您还需要定义 __newindex 元方法。您可以在我提供的 Lua 手册的相应部分中找到更多信息。

话虽如此,如果我是你,我会再次考虑是否真的需要所有这些代理表复杂性。例如,在使用 pairsipairs 迭代您的环境时,如果没有添加 __ipairs__pairs 元方法,将会失败。

2012-07-29 04:53:05