北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 3336|回复: 1

关于Metatables的一点理解

[复制链接]
发表于 2011-12-28 09:10:15 | 显示全部楼层 |阅读模式
本帖最后由 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
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2011-12-28 09:30:45 | 显示全部楼层
以前也是不太理解,上论坛问了好多次,别人告诉我是奇技巧淫计。
但是看到lua

北大侠客行MUD,中国最好的
wdzyss 发表于 2011-12-28 09:10 AM



    lua的那点东西,上lua的官网看manual就够了。而lua这个设计用来做面向对象,确实是不折不扣的奇技淫巧。lua不是用来做面向对象的。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-1 07:27 PM , Processed in 0.009781 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表