Squirrel文档翻译(元方法2)

来源:互联网 发布:ibatis 源码 编辑:程序博客网 时间:2024/05/21 09:24

元方法

元方法是一种用来定制语言语意某方面的特性的机制。这些元方法就是保存在父表(委托)中或者类对象的声明中。可以通过定义元方法来改变表或者类实例很多方面的特性。类对象(不是实例)仅支持两种形式的元方法:_newmember,_inherited.

 

比如我们在两个表上使用关系运算符==,虚拟机会检查在它的父表中是否存在名为“_cmp”的元方法,如果存在,就会调用这个元方法去决定两表之间的关系。

local comparable={
_cmp = function (other)
{
          if(name<other.name)return -1;
          if(name>other.name)return 1;
          return 0;
}
}

local a=delegate comparable : { name="Alberto" };
local b=delegate comparable : { name="Wouter" };

if(a>b)
     print("a>b")
else
     print("b<=a");

 

对于类,上面的类做变做:

class Comparable {
constructor(n)
{
        name = n;
}
function _cmp(other)
{
       if(name<other.name) return -1;
       if(name>other.name) return 1;
        return 0;
}
name = null;
}

local a = Comparable("Alberto");
local b = Comparable("Wouter");

if(a>b)
       print("a>b")
else
       print("b<=a");

 

1 _Set

当索引idx不在对象中或者他的委托链中时调用

function _set(idx,val) //返回 val

2 _Get

当索引idx不在对象中或者它的委托链中时调用

function _get(idx) //返回查找的值

3 _newslot

当脚本尝试向表中添加一个槽时调用

function _newslot(key,value) //返回 val

如果该槽在表中已经存在或者调用new slot操作符时,该方法将不会被调用

4 _delslot
当脚本从表中删除一个槽时调用

如果该方法被调用,Squirrel不会尝试删除槽的本身

function _delslot(key)

5 _add

+运算符function _add(op) //返回 this+op

6 _sub

-运算符(同于_add)

7 _mul

*运算符(同于_add)

8 _div

/运算符(同于_add)

9 _modulo

%运算符(同于_add)

10 _unm

单目减运算符

function _unm()

11 _typeof

当在表,userdata或者类实例上使用typeof的时候调用

function _typeof() //以字符串的形式返回this的类型

12 _cmp

当做< > <= >= 调用时调用
function _cmp(other)
返回整型值 

>0 if this > other
0 if this == other
<0 if this < other

13 _call

当调用一个table,userdata或者类实例的时候被调用

function _call(original_this,params...)

14 _cloned
当一个类或者表被克隆的时候调用(调用发生在克隆表中)

function _cloned(original)

15 _nexti

当userdata或者类实例被foreach循环轮训的时候调用。
function _nexti(previdx)
如果 previdx==null 意味着这是第一次迭代, 这个函数必须返回下一个索引。

16 _tostring

在字符串拼接过程中,或者print函数打印表,userdata或类实例的时候被调用。这个方法也可以被sq_tostring()函数调用。
function _tostring()
必须返回一个字符串来表示对象。

17 _inherited

当一个类对象从一个实现了_inherited方法的类中继承时调用。
function _inherited(attributes)
忽略返回值

18 _newmember
每一个成员在类体中声明时被调用(在声明期)

function _newmember(index,value,attributes)
如果函数实现过,成员就不会被添加到类中

 

 

原创粉丝点击