首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Metatable不被索引,即使使用setmetatable。

Metatable不被索引,即使使用setmetatable。
EN

Stack Overflow用户
提问于 2015-12-13 22:13:09
回答 1查看 745关注 0票数 2

根据Lua手册,setmetatable仍然与Lua5.0一样工作。然而,由于某种原因,当我在Lua5.1.5和5.3.1中尝试这段代码时,似乎无法访问元可访问性:

代码语言:javascript
复制
ClassTable = {}
ClassTable.getString = function(self) 
  return self.x .. ""
end

inst = {}
setmetatable(inst, ClassTable)
inst.x = 7

--doens't work
assert(getmetatable(inst) == ClassTable)
print(inst:getString())

第一种情况有效,但是在第二种情况下,I得到了一个错误,这表明不使用metatable:

代码语言:javascript
复制
./lua: /test.lua:12: attempt to call method 'getString' (a nil value)
stack traceback:
    test.lua:12: in main chunk
    [C]: ?

这也与方法调用操作符":“无关,因为即使获得方法的值也不会转到元操作。

代码语言:javascript
复制
print(inst.getString)
nil
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-13 22:23:51

要使表inst访问元方法,需要使用元方法__index

因此,您可以通过在ClassTable.getString定义下面的顶部添加这一行来更正代码:

代码语言:javascript
复制
ClassTable.__index = ClassTable

不管名称如何,__index元方法不需要是函数:它可以是一个表,而不是一个表。当它是一个函数时,Lua用表和缺席键作为它的参数调用它。当它是一个表时,Lua将重新执行该表中的访问。

  • http://www.lua.org/pil/13.4.1.html
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34257013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档