北京理工大学 20981 陈罡
(1)Null
用来表示空,不存在的引用。这个Null的数据类型的可取值只有一个,就是null。
例如:
local a = null ;
(2)Bool
该数据类型,只有true和false两种取值。
(3)Table
这东西感觉上跟c语言的结构体挺像的,只不过做为脚本来说是这里定义的结构体
的成员变量是可以动态添加和删除的。
例如:
local t = {} ; // 这种方式定义table就代表是一个空的表对象,没有定义任何变量
// 感觉上可以认为是定义了一个没有任何成员变量的空结构体
t.a = 6 ; // 这一句一定是错的,因为此时t表对象还没有动态创建一个叫做a的
// 数据成员,因此直接用等号赋值,就会出现a没有定义的错误。
t.a <- 3 ; // 这一步是动态给这个结构体创建成员变量了。这里使用"<-"来表示
// 如果t结构体有t.a这个成员变量,则直接跟赋值语句一样把3这个整数
// 直接赋值给t.a变量;如果t结构体没有t.a这个成员变量,则会自动
// 创建一个叫做t.a的成员变量,然后把整数3赋值给t.a。
t.a = 5 ; // 这个时候由于已经通过“t.a <- 3”为t表创建了a这个变量,因此可以用
// t.a = 5这个赋值语句来对该变量进行操作。
delete t.a ; // 这一步就是动态删除掉t表对象的t.a这个成员变量,如果在这句以后
// 再次调用t.a = xxxx,系统就会报错,说t表里面不存在a这个变量。
t.a = 4 ; // 这一句就会出错,因为delete t.a这一句,已经把t表的a对象动态删除,
// 这时候就会出现a没有定义的错误。
// 以下这些也是合法的,意思是在声明名字叫做test的表类型的对象的时候,为该对象
// 创建两格成员变量a和b并且分别赋以初值。
local test =
{
a = 0
b = function(a) { return a + 1 ; }
} ;
有几点需要注意的地方,对于table类型的变量,
(4)Array
就是数组了,很常见,可以保存一组连续的对象。与传统c/c++相比,squirrel
中定义的数组是支持动态调整数组的大小的(这一点玩过MFC的朋友,会立即
联想到CArray,hoho)。另外跟c/c++一样,下标通常从0开始。
local a = {"I'm", "an", "array"} ;
local b = {null} ;
b[0] = a[2] ;
(5)Function
首先,函数是可以做为跟整数或字符串一样,存放到Table里面的(这个时候叫key/slot),
也可以存放到数组,还可以做为其它函数的参数传入到其它的函数中去。函数可以用
squirrel脚本本身去定义和实现,也可以用实现squirrel的内部语言(说话费劲,其实就是
说的是c/c++语言,这里的意思是,可以通过自己修改sq的代码,在代码里面构造一些“内置”
的函数,可以在脚本里面去调用这些函数用以实现特殊的功能和要求。呵呵,这是必然的了,
要不干嘛玩这个东西呢?通过脚本去调用c/c++的模块,是偶研究squirrel的最终目标。)
Function定义方法(这里都是指在脚本里面定义函数的方法)
1)使用函数表达式的定义方法
例如:
local a = function(a, b, c) {return a + b - c ; }
2)使用常规语法定义函数
例如:
function foo(a, b, c)
{
return a + b - c ;
}
也可以这样写:
this.foo <- function(a, b, c)
{
return a + b - c ;
}
还可以这样写:
T <- {}
function T::foo(a, b, c)
{
return a + b - c ;
}
...我有点晕了,也可以这样写:
T.foo <- function(a, b, c)
{
return a + b - c ;
}
彻底疯了,竟然还可以这样写:
T <- {
function foo(a, b, c)
{
return a + b - c ;
}
}
前面几个还好,后面这个就有些让人头晕了。
参考一下Table就可以清楚地看出来,这个“<-”是用来为table类型的表对象
创建插槽(slot)的,如果插槽不存在则会创建这个插槽,如果插槽存在则与传统
的等号赋值运算符的操作是一样的。
3)支持缺省值定义的函数
这个特性对于c++和java类的面向对象编程语言来说,都是常规功能了。
function test(a,b,c = 10, d = 20)
{
....
}
4)下面这个挺重要的,就是支持变参数的函数定义
这个就类似于printf之类的函数,可以支持不定个数的参数的函数定义,
来段代码就能够直接解释这个问题了。
function test(a,b,...)
{
for(local i = 0; i< vargc; i++)
{
::print("varparam "+i+" = "+vargv[i]+"\n");
}
}
test("goes in a","goes in b",0,1,2,3,4,5,6,7,8);
呼呼,时间过得真快,又到了睡觉的时间,明天再继续。
今天感觉上已经渐渐地明白squirrel的语法到底是怎么回事了,呵呵,再接再厉。
阅读(7320) | 评论(1) | 转发(0) |