Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1532409
  • 博文数量: 114
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 1357
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 18:13
文章分类
文章存档

2010年(8)

2009年(9)

2008年(27)

2007年(62)

2006年(8)

我的朋友

分类: C/C++

2009-01-12 23:01:24

北京理工大学 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) |
给主人留下些什么吧!~~

chinaunix网友2010-09-27 17:45:42

写的很好,多谢