本帖最后由 wdzyss 于 2011-12-28 09:32 AM 编辑
以前也是不太理解,上论坛问了好多次,别人告诉我是奇技巧淫计。
但是看到lua中面向对象的设计经常使用到这个,所以仔细研究了下。
其实也是很简单的东西。我通俗说下。
1.lua中目前只能给table设置metatable
2.metatable虽然提供了数学运算,但是我感觉还是__index,和__newindex用的比较多。
3.特别是__index,在面向对象里经常用到。
__index具体是i什么用法呢?其实很简单,就是一个table,如果在这个table里查不到某个值,
一般都会返回nil,如果你设置了原表_index,那么他就会去他的metatable里找这个值。
如下:Window = {} -->初始化table window Window.prototype = {x=0, y=0, width=100, height=100, } -->初始化table window里的子table prototype
Window.mt = {} -->初始化table window里子table mt
function Window.new (o) --> 一个函数用来构造新的table,这个新的table使用window.mt作为他的原表
setmetatable(o, Window.mt) return end
假设我们现在用w = Window.new{x=10, y=20} 大家可以想下如果你敲print(w.width),会有什么结果。我们可以看下,w这个table里有width吗? 肯定没有,因为初始化的时候就给w.x w.y 赋值了。w.width因该是nil,但是w有设置了原表,那么table w里没w.width, 他就去原表查,但是他的原表是window.mt。所以你还要给window.mt设置个index的方法。 Window.mt.__index = Window.prototype 这样w.width就会去window.prototype里查width这个值了。 饿 其实这个就是lua设计中的例子,我比较笨,看了好多次才看懂。 这样你再看第16章面向对象的设计就很明白了。发现真的是用的太妙了。
北大侠客行MUD,中国最好的MUD |