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值赋值给常量或枚举(函数,类等)。可是这使得不可能序列化代码。
- Squireel文档翻译(元方法)
- Squireel文档翻译(线程)
- Squireel文档翻译(表达式2)
- Squirrel文档翻译(元方法2)
- Boost-(MSM)元状态机文档翻译-前言
- django 1.8 官方文档翻译: 2-1-3 元选项 (初稿)
- 翻译 - 元编程动态方法之public_send
- 翻译 - 元编程动态方法之public_send
- Smack文档(翻译)
- Smack文档(翻译)
- Smack文档(翻译)
- Tolua++文档(翻译)
- Lua文档翻译(中)
- AGG文档翻译(一)
- fmdb官方文档(翻译)
- V4L2文档翻译(一)
- V4L2文档翻译(二)
- V4L2文档翻译(三)
- 有关SQL 中 exists 与 in
- 嵌入式Linux文件系统及其存储机制分析
- AddressBookUtil的代码
- python获取当前日期前后N天或N月的日期
- java.util.Arrays.sort方法简单分析
- Squireel文档翻译(元方法)
- 二进制的理解
- 获取网站某页面的html信息两种方法
- log4j
- 简述rrdtool文件的创建方法
- How to use isTokenValid
- 两个日期之间计算天数
- __declspec( selectany ) 含义
- gcc命令之 -------objcopy