Squireel文档翻译(元方法)

来源:互联网 发布:恒大淘宝足球股价 编辑:程序博客网 时间:2024/06/07 16:44

元方法

类的实例允许通过元方法修改类的一些特定方面的语义。对于C++程序员来讲,元方法行为就是一些类似重载运算符的丑陋方法。支持类的元方法有:_add,_sub,_mul,_div,_unm,_modulo,_set,_get,_typeof,_nexti,_cmp,_call,_delslot,_tostring.

类的对象只支持两种元方法:_newmember和_inherited.

 

下面的例子展示怎样创建一个实现元方法_add的类:

class Vector3

{
           constructor(...)
          {
                if(vargc >= 3)

               {
                    x = vargv[0];
                    y = vargv[1];
                    z = vargv[2];
               }
           }

           function _add(other)
          {
                  return ::Vector3(x+other.x,y+other.y,z+other.z);
          }

          x = 0;
          y = 0;
          z = 0;
}

local v0 = Vector3(1,2,3)
local v1 = Vector3(11,12,13)
local v2 = v0 + v1;
::print(v2.x+","+v2.y+","+v2.z+"/n");

 

从版本2.1开始,类支持两种形式的元方法_inherited和_newmember. _inherited在一个类继承另外一个实现了_inherited元方法的类时被调用。_newmember是每一个成员添加到类中时被调用(在声明期)。

 

生成器

一个包含了yield语句块的函数被称作生成器。当一个生成器函数被调用的时候,他不是执行函数体,而是返回一个新的挂起的生成器。这个返回的生成器可以通过resume语句恢复。这个yield关键字,挂起生成器的执行,并且返回表达式的值给你恢复生成器的函数,这是可选的。生成器当在它返回或者执行结束时消失,这可以通过显示的调用return语句块或者直接退出函数体,当在生成器执行的过程中出现异常(运行时错误),生成器自动消失。一个死掉的生成器不能被恢复。

 

function geny(n){    for(local i=0;i<n;i+=1)        yield i;    return null;}local gtor=geny(10);local x;while((x = resume gtor) != null) print(x+”/n”);
生成器可以被foreach语句块迭代遍历。当一个生成器被foreach执行,生成器在每一次迭代时被激活,直到它返回。生成器的返回值被忽略。

常量和枚举

Squireel允许给标识符绑定一个常量,这在编译期被执行。这可以通过常量和枚举实现。

 

常量

常量绑定一个指定的值给标识符。常量除过在编译器被执行并且不能被修改外和全局变量一样。

常量值只能是整型,浮点型和字符串。不能是表达式。其声明语法如下:

const foobar = 100;
const floatbar = 1.2;
const stringbar = "I'm a contant string";

常量的作用域一般是全局的,开始于它被声明的地方。后续的代码都可以引用它。常量将会覆盖所有的使用相同名字的全局变量槽(全局槽可以通过语法::保证可见)

local x = foobar * 2;

 

枚举类型

相比常量,枚举类型绑定一个特定的值给一个名字。枚举类型同样是编译期执行并且不可改变。

一个enum声明将会在程序中产生一个新的枚举类型。枚举类型的值只能是字符串,整型,浮点型,不能是表达式。

enum Stuff {
    first, //this will be 0
    second, //this will be 1
    third //this will be 2
}
或者

enum Stuff {
    first = 10
    second = "string"
    third = 1.2
}

 

一般来说,访问一个枚举变量类似于访问类的静态成员。变量的名字必须是有效的枚举类型的名字。比如,Stuff.second.枚举类型将会覆盖所有同名的全局变量槽(全局变量槽可以通过::可见)。

local x = Stuff.first * 2;

 

实现时的注意事项

常量和枚举类型是编译期特性,只有整型,浮点型和字符串型可以被声明为常量或枚举。表达式不允许(因为表达式计算必须在编译期执行)。当声明了一个常量或枚举,它就会在编译期被加到consttable中。这个表存储在虚拟机的共享段中,可以被虚拟机以及其线程共享。这个consttable是个规则的Squireel表,和roottable一样,它可以在运行期被修改。你可以通过内置函数getconsttable()去获取consttable或者通过函数setconsttable()设置该表。

下面是个例子:

//创建一个常量
getconsttable()["something"] <- 10"
//创建一个枚举
getconsttable()["somethingelse"] <- { a = "10", c = "20", d = "200"};
//删除一个常量
delete getconsttable()["something"]
//删除一个枚举
delete getconsttable()["somethingelse"]

 

改系统允许阶段性的定义常量和枚举类型,他也允许把任意类型的Squireel值赋值给常量或枚举(函数,类等)。可是这使得不可能序列化代码。

 

 

原创粉丝点击