wdzyss 发表于 2011-12-28 09:10:15

关于Metatables的一点理解

本帖最后由 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 windowWindow.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)    returnend
假设我们现在用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

jason 发表于 2011-12-28 09:30:45

以前也是不太理解,上论坛问了好多次,别人告诉我是奇技巧淫计。
但是看到lua

北大侠客行MUD,中国最好的
wdzyss 发表于 2011-12-28 09:10 AM http://pkuxkx.com/forum/images/common/back.gif


    lua的那点东西,上lua的官网看manual就够了。而lua这个设计用来做面向对象,确实是不折不扣的奇技淫巧。lua不是用来做面向对象的。
页: [1]
查看完整版本: 关于Metatables的一点理解