我如何在lua中实现只读表?

这意味着我可以访问表“tbl”的字段,但与此同时,我无法更改与字段相关的值。

现在,问题是我想让所有嵌套表都拥有这个只读属性。我该如何改进“readOnly”方法?

点赞
用户3677376
用户3677376

你只需要对内部的表字段递归地应用readOnly函数。你可以在__index元方法中通过on-access这样做。你还应该缓存你创建的只读代理表,否则对内部表(例如hold.sex)的任何读取访问都会创建一个新的代理表。

-- 记住原始表到代理表的映射
local proxies = setmetatable( {}, { __mode = "k" } )

function readOnly( t )
  if type( t ) == "table" then
    -- 检查我们是否已经有了此表的只读代理
    local p = proxies[ t ]
    if not p then
      -- 为 t 创建新的代理表
      p = setmetatable( {}, {
        __index = function( _, k )
          -- 递归地对字段 `t[k]` 应用 `readonly`
          return readOnly( t[ k ] )
        end,
        __newindex = function()
          error( "table is readonly", 2 )
        end,
      } )
      proxies[ t ] = p
    end
    return p
  else
    -- 非表直接原样返回
    return t
  end
end
2015-02-04 07:14:40