当前位置: 首页 > 编程笔记 >

Lua中的__index方法详解

施鸿
2023-03-14
本文向大家介绍Lua中的__index方法详解,包括了Lua中的__index方法详解的使用技巧和注意事项,需要的朋友参考一下

当我们访问一个表的不存在的域,返回结果为nil,这是正确的,但并不一定正确。实际上,这种访问触发lua解释器去查找__index metamethod:如果不存在,返回结果为nil;如果存在则由__index metamethod返回结果。

这个例子的原型是一种继承。假设我们想创建一些表来描述窗口。每一个表必须描述窗口的一些参数,比如:位置,大小,颜色风格等等。所有的这些参数都有默认的值,当我们想要创建窗口的时候只需要给出非默认值的参数即可创建我们需要的窗口。第一种方法是,实现一个表的构造器,对这个表内的每一个缺少域都填上默认值。第二种方法是,创建一个新的窗口去继承一个原型窗口的缺少域。首先,我们实现一个原型和一个构造函数,他们共享一个metatable:


-- create a namespace

Window = {}

-- create the prototype with default values

Window.prototype = {x=0, y=0, width=100, height=100, }

-- create a metatable

Window.mt = {}

-- declare the constructor function

function Window.new (o)

    setmetatable(o, Window.mt)

    return o

end


现在我们定义__index metamethod:

Window.mt.__index = function (table, key)

    return Window.prototype[key]

end


这样一来,我们创建一个新的窗口,然后访问他缺少的域结果如下:

w = Window.new{x=10, y=20}

print(w.width)       --> 100


当Lua发现w不存在域width时,但是有一个metatable带有__index域,Lua使用w(the table)和width(缺少的值)来调用__index metamethod,metamethod则通过访问原型表(prototype)获取缺少的域的结果。

__index metamethod在继承中的使用非常常见,所以Lua提供了一个更简洁的使用方式。__index metamethod不需要非是一个函数,他也可以是一个表。但它是一个函数的时候,Lua将table和缺少的域作为参数调用这个函数;当他是一个表的时候,Lua将在这个表中看是否有缺少的域。所以,上面的那个例子可以使用第二种方式简单的改写为:


Window.mt.__index = Window.prototype


现在,当Lua查找metatable的__index域时,他发现window.prototype的值,它是一个表,所以Lua将访问这个表来获取缺少的值,也就是说它相当于执行

Window.prototype["width"]


将一个表作为__index metamethod使用,提供了一种廉价而简单的实现单继承的方法。一个函数的代价虽然稍微高点,但提供了更多的灵活性:我们可以实现多继承,隐藏,和其他一些变异的机制。我们将在第16章详细的讨论继承的方式。

 类似资料:
  • 本文向大家介绍Lua中强大的元方法__index详解,包括了Lua中强大的元方法__index详解的使用技巧和注意事项,需要的朋友参考一下 今天要来介绍比较好玩的内容——__index元方法 1.我是备胎,记得回头看看 咳咳,相信每一位女生都拥有或者不知不觉中拥有了一些备胎,啊,当然,又或许是成为过别人的备胎。 没有备胎的人,就不是完整的人生。(小若:停!)   我们来想象一下,如果对一个tabl

  • 本文向大家介绍理解Lua中的__index和__newindex,包括了理解Lua中的__index和__newindex的使用技巧和注意事项,需要的朋友参考一下 总结: 如果在元table中去找相应的操作,例如__index,__newindex等,如果有则直接访问,如果没有就新添加进元table中

  • 本文向大家介绍Lua中的元方法__newindex详解,包括了Lua中的元方法__newindex详解的使用技巧和注意事项,需要的朋友参考一下 好吧,我写文章的进度已经赶不上看书的进度了,简单的几段文字就够我唠叨一篇文章了。 今天继续来说说元方法,与__index有点相似的__newindex元方法。 1.查询与更新 上一篇文章我们介绍了__index元方法,总结来说,__index元方法是用于处

  • 本文向大家介绍Lua中__index和__newindex之间的沉默与合作,包括了Lua中__index和__newindex之间的沉默与合作的使用技巧和注意事项,需要的朋友参考一下 因为不想在一篇文章里挤太多知识点,所以,有些小知识点就集合到这样的文章里吧~ 1.沉默技能——拒绝__index和__newindex效果 虽然__index和__newindex是很好用的功能,但是,有时候我们又希

  • 本文向大家介绍详解Lua中的if语句的使用方法,包括了详解Lua中的if语句的使用方法的使用技巧和注意事项,需要的朋友参考一下  if语句由一个或多个语句组成一个布尔表达式。 语法 Lua编程语言的if语句语法是: 如果布尔表达式的计算结果为代码的if语句为true,那么块将被执行。如果if语句的末尾(右大括号后)布尔表达式计算为false,那么第一组代码将被执行。 Lua程序设计语言假定布尔tr

  • 本文向大家介绍详解Lua中if ... else语句的使用方法,包括了详解Lua中if ... else语句的使用方法的使用技巧和注意事项,需要的朋友参考一下  if 语句后面可以跟一个可选的else语句,当布尔表达式为假该语句执行。 语法 在Lua编程语言中的if ... else语句的语法是: 如果布尔表达式的值为true,那么if代码块将被执行,否则else代码块将被执行。 Lua程序设计语