setmetatable(t, mt) -- 把mt设为t的元表 getmetatable(t) -- 这回返回mt 如你所见getmetatable和setmetatable是主要的函数。 当然我们可以把上面的三行代码合为: t = setmetatable({}, {}) setmetatable返回第一个参数, 因此我们可以使用这个简短的表达式。现在,我们在元表里放些什 么呢? 元表可以包含...
(二) 下面介绍rawget 和rawset 有时需要get 和set表的索引,不想使用metatable.你可能回猜想, rawget 允许你得到索引无需__index,rawset允许你设置索引的值无需__newindex (相对传统元表的方式,这些不会提高速度)。为了避免陷在无限循环里,你才需要使用它们。 在上面的例子里,t[key] = value * value将再次调用...
构成metatable的方式是一个metatable挂接一个table, 如下所示: tbl1 = {"alpha", "beta", "gamma"} mt = {} setmetatable(tbl1, mt) 可以用getmetatable()语句来检视一个table所挂接的metatable. > print(getmetatable(tbl1) == mt) true metatable通过其包含的函数来给所挂接的table定义一些特殊的操作...
rawget(getmetatable(o)or{},"__ev") 关于rawget,简单介绍一下rawget(table,index) 指不触发任何元方法的情况下获取table[index]的值,table必须是一张表,index可以是任何值。 有两个很重要的函数来处理元表: setmetatable(table,metatable):对指定table设置元表,如果元表中存在_metatable键值,setmetatable会失败。
setmetatable(table,metatable):对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。 getmetatable(table):返回对象的元表(metatable)。 -- 设置方式 1 mytable = {} -- 普通表 mymetatable = {} -- 元表 ...
Lua语言中的每一个值都可以有元表,只有table和userdata可以有各自独立的元表,其他类型则共享其类型所属的同一个元表。 获取元表 获取元表使用getmetatable()方法 t={}print(getmetatable(t))--> nil 设置元表 可以使用函数setmetatable来设置或修改任意表的元表 ...
1)元表设置:setmetatable(table, metatable) 2)元表读取:getmetatable(table) 3)元方法操作: metatable.元方法 = function (可接受参数) (函数体) end 如: -- 定义__index元方法 Windows.mt.__index = function (table, key) return Windows.default[key] ...
每个事件的键名用加有 '__' 前缀的字符串来表示;例如 "add" 操作的键名为字符串 "__add"。注意、Lua 从元表中直接获取元方法;访问元表中的元方法永远不会触发另一次元方法。下面的代码模拟了 Lua 从一个对象obj中获取一个元方法的过程:rawget(getmetatable(obj) or {}, "__" .. event_name)。
元表和表是一一对应的,有setmetatable去设置元表,也可以通过getmetatable去获取元表,语法:...
元表查找遵循一定的规则:元方法在元表中的键称为事件,值则是元方法。所有值都有可能关联元表,但table和userdata有独立的元表。获取和设置元表分别通过getmetatable和setmetatable函数实现,其中表是唯一能有自定义元表的类型。预定义的运算符元方法包括__add等,它们对应特定的算术操作。访问表元素时...