Toluapp 类访问标签

lua-users home
wiki

从 1.0.7 版本开始,tolua++ 包含 2 个新功能,使在类(或任何容器,包括命名空间、模块,甚至主包)中轻松实现 publicprotectedprivate 标签。

对象访问

每个 tolua++ 对象都有一个 access 标志,它决定对象在其容器内的访问权限。容器对象也有一个名为 curr_member_access 的成员,它决定每个子对象在添加到容器时其 access 的值。

access 的值为 nilfalse0 时,对象被认为是公共的。任何其他值都表示非公共,tolua++ 不关心。所有对象的默认访问值为 nil,因此此新功能不会影响当前用户。

parser_hook

parser_hook 是一个在主解析器函数开始时调用的空函数,它将要解析的文本作为参数。此函数可以在自定义 lua 文件中重新实现,并使用 -L 选项在 tolua++ 中运行。通常,解析器函数会在字符串的开头搜索一个标记,如果找到任何内容,则返回该字符串,但没有该标记(在对该标记执行了必要的操作之后)。parser_hook 可以安全地返回 nil

实现访问标签

此示例实现 'parser_hook' 来查找标签,并将 curr_member_access 设置为当前访问权限。它还将 curr_member_access 默认设置为私有(基于 curr_member_access 的默认值为 nil)。这些标签仍然可以在其他容器(模块、命名空间和主包)上工作,但这些容器仍然默认是公共的。

-- access_hook.lua

local access = {public = 0, protected = 1, private = 2}

function preparse_hook(p)
	-- we need to make all structs 'public' by default
	p.code = string.gsub(p.code, "(struct[^;]*{)", "%1\npublic:\n")
end


function parser_hook(s)

        local container = classContainer.curr -- get the current container
        if not container.curr_member_access and container.classtype == 'class' then
                -- default access for classes is private
                container.curr_member_access = access.private
        end

        -- try labels (public, private, etc)
        do
                local b,e,label = string.find(s, "^%s*(%w*)%s*:[^:]") -- we need to check for [^:], otherwise it would match 'namespace::type'
                if b then

                        -- found a label, get the new access value from the global 'access' table
                        if access[label] then
                                container.curr_member_access = access[label]
                        end -- else ?

                        return strsub(s, e) -- normally we would use 'e+1', but we need to preserve the [^:]
                end
        end

end

用法

$ tolua++ -L access-hook.lua package.pkg


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2006 年 1 月 26 日凌晨 1:09 GMT (差异)