MetaTable

fastdb 只有一个MetaTable,内容如下

metaTableFields[] = {
        { "name", dbField::tpString, sizeof(dbVarying),
          offsetof(dbTable, name)},
        { "fields", dbField::tpArray, sizeof(dbVarying),
          offsetof(dbTable, fields)},
        { "fields[]", dbField::tpStructure, sizeof(dbField), 0},
        { "fields[].name", dbField::tpString, sizeof(dbVarying),
          offsetof(dbField, name)},
        { "fields[].tableName",dbField::tpString,sizeof(dbVarying),
          offsetof(dbField, tableName)},
        { "fields[].inverse", dbField::tpString, sizeof(dbVarying),
          offsetof(dbField, inverse)},
//        { "fields[].type", dbField::tpInt4, 4, offsetof(dbField, type)},
        { "fields[].type", dbField::tpInt4, 4, offsetof(dbField, offset)-4},
        { "fields[].offset", dbField::tpInt4, 4, offsetof(dbField, offset)},
        { "fields[].size", dbField::tpInt4, 4, offsetof(dbField, size)},
        { "fields[].hashTable", dbField::tpReference, sizeof(oid_t),
          offsetof(dbField, hashTable)},
        { "fields[].tTree", dbField::tpReference, sizeof(oid_t),
          offsetof(dbField, tTree)},
        { "fixedSize", dbField::tpInt4, 4, offsetof(dbTable, fixedSize)},
        { "nRows", dbField::tpInt4, 4, offsetof(dbTable, nRows)},
        { "nColumns", dbField::tpInt4, 4, offsetof(dbTable, nColumns)},
        { "firstRow", dbField::tpReference, sizeof(oid_t), offsetof(dbTable, firstRow)},
        { "lastRow", dbField::tpReference, sizeof(oid_t), offsetof(dbTable, lastRow)}
#ifdef AUTOINCREMENT_SUPPORT
       ,{ "count", dbField::tpInt4, 4, offsetof(dbTable, count)}
#endif
    };

 

MetaTable,其实里面什么也没有存,只起一个标记作用,它有一个next指针,指向第一个创建的表,当查找表时,就从MetaTable表的next指针依次向后找,所有的表构成一个双向链表。

这主要是因为MetaTable的oid是固定的,为1

### Lua 中元表的使用方法 在 Lua 编程语言中,元表(metatable)是一种强大的特性,允许程序员自定义表格的行为。通过设置特定字段,可以改变或扩展表格的操作方式。 #### 创建并应用元表 要创建一个带有元表的对象,首先需要创建一个普通的 Lua 表格,之后再为此表格关联一个新的或已存在的元表: ```lua local myTable = {} -- 定义一个新表 setmetatable(myTable, {__index = function(t,k) return k.." not found." end}) print(myTable.anyKey) -- 输出 'anyKey not found.' ``` 上述代码展示了如何利用 `__index` 这一特殊的键来处理未找到索引的情况[^1]。 #### 使用内置事件触发器 除了 `__index` 外,还有其他多种可用于控制不同操作行为的方法,比如当尝试给不存在的成员赋值时会调用 `__newindex`; 当两个对象相加时则可能涉及到了 `__add` 方法等。下面的例子演示了怎样实现自定义加法运算逻辑: ```lua -- 自定义向量类及其算术运算符重载 Vector = {} function Vector.new(x,y) local v={x=x or 0, y=y or 0} setmetatable(v,{ __add=function(a,b)return Vector.new(a.x+b.x,a.y+b.y)end, __tostring=function(self)return "("..self.x..","..self.y..")"end }) return v end v1=Vector.new(1,2) v2=Vector.new(-3,-4) print((v1+v2)) --> (-2,-2) ``` 这段程序片段不仅实现了简单的二维矢量之间的加法计算,还提供了友好的字符串表示形式以便于调试输出。 #### 继承机制模拟 借助元表还可以轻松模仿面向对象编程中的继承概念。这里给出了一种简单的方式来进行基类与派生类之间属性共享的设计模式: ```lua BaseClass = { baseMethod = function() print("This is Base Class Method.") end; } DerivedClass = {} setmetatable(DerivedClass,{__index=BaseClass}) derivedInstance = DerivedClass() derivedInstance.baseMethod() -- 调用了来自父级的方法 ``` 此段脚本说明了子类可以从超类那里获取公共接口而无需重复声明相同的功能函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值