PScript 脚本(进一步的特征)
发表于 2006-04-18 12:10 PM 作者: Innocentius
PScript具有进一步的特征,包括作用域、引用和动态对象等。
作用域
PScript具有作用域的概念。作用域是由BEGIN……END括起来的范围,下面的语句定义了两个作用域:
这段程序显示:
2
1
这表明在BEGIN内的Declare语句声明了一个新的变量A,并且A=2是针对这个新变量进行赋值的,因此没有影响外部作用域中的变量A的值。
默认情况下,名字的查找是由内部作用域向外部作用域进行查找,如果没有找到,则在最内部的作用域创建一个新变量。但是也可以指定从外部作用域向内部作用域查找,方法是在名字前加上“.”。例如:
这段程序显示:
2
1
符号a是从内部作用域向外搜索得到的变量,而符号.a是从外部作用域向内搜索得到的变量。
对于一个复合对象来说,同样具有作用域。例如:
程序显示的结果为:
2
1
此处,func访问变量b类似于C++语言中通过this来进行访问类的成员变量一样。
引用
在PScript中,赋值语句仅仅复制引用,因此下面程序:
运行的结果为2,而不是1。因为在赋值语句以后,变量a和b实际上都是值1的引用,当设置b=2,等价于把a=2,因此a的值也被改变。
引用同时用于函数调用的参数传递,因此下列程序:
运行的结果就是2,而不是1。
为了获得真正的拷贝,可以使用Clone语句来复制对象。
这段程序的运行结果是1,因为b是a的一个拷贝,而不是引用,因此修改b对a就没有任何影响了。
动态对象
和传统语言不同,PScript的对象并不是通过Declare声明以后就不能修改的。相反,程序员可以在任何时刻改变对象的类型,包括其中的字段。例如;
这里,首先声明了一个数组arr,并且将第一个元素设置为1。然后声明变量a,将arr赋值给a,这时a就从一个简单变量转变为一个数组,然后我们就可以通过数组的语法来访问它了。
然而,下面的语句将会出现一个错误:
Declare a;
Print(a[1]);
这将会导致错误R770:Array object expected。这表明PScript发现a实际上并不表示任何数组,所以报告这个错误。
不仅可以在数据类型之间进行转换,也可以在函数类型之间转换。例如:
这段代码将通过对象a来调用函数f,如同直接调用函数f一样。
简单对象也可以转换为复合对象。例如:
运行的结果是;
2
1
当对一个对象赋值,而这个对象实际不存在的时候,PScript会自动创建一个合适的对象。最终结果就可以动态地改变一个对象中的成员。
作用域
PScript具有作用域的概念。作用域是由BEGIN……END括起来的范围,下面的语句定义了两个作用域:
代码:
Declare a; A=1; Begin Declare a; A=2; Print(a); End; Print(a);
2
1
这表明在BEGIN内的Declare语句声明了一个新的变量A,并且A=2是针对这个新变量进行赋值的,因此没有影响外部作用域中的变量A的值。
默认情况下,名字的查找是由内部作用域向外部作用域进行查找,如果没有找到,则在最内部的作用域创建一个新变量。但是也可以指定从外部作用域向内部作用域查找,方法是在名字前加上“.”。例如:
代码:
Declare a; A=1 Begin Declare a; A=2; Print(a); Print(.a); End;
2
1
符号a是从内部作用域向外搜索得到的变量,而符号.a是从外部作用域向内搜索得到的变量。
对于一个复合对象来说,同样具有作用域。例如:
代码:
Declare a: Object
Begin
Declare b;
Declare func: Function
Begin
B = 2;
Print(b);
Print(.b);
End;
End;
B = 1;
Call a.func(); 2
1
此处,func访问变量b类似于C++语言中通过this来进行访问类的成员变量一样。
引用
在PScript中,赋值语句仅仅复制引用,因此下面程序:
代码:
Declare a; Set a = 1; Set b = a; Set b = 2; Print(a);
引用同时用于函数调用的参数传递,因此下列程序:
代码:
Declare func: Function(a) Begin A=2; End; S=1; Call func(s); Print(s);
为了获得真正的拷贝,可以使用Clone语句来复制对象。
代码:
Declare a; Set a = 1; Clone b = a; Set b = 2; Print(a);
动态对象
和传统语言不同,PScript的对象并不是通过Declare声明以后就不能修改的。相反,程序员可以在任何时刻改变对象的类型,包括其中的字段。例如;
代码:
Declare arr: array[8] of object; Arr[1]=1; Declare a; A=arr; Print(a[1]);
然而,下面的语句将会出现一个错误:
Declare a;
Print(a[1]);
这将会导致错误R770:Array object expected。这表明PScript发现a实际上并不表示任何数组,所以报告这个错误。
不仅可以在数据类型之间进行转换,也可以在函数类型之间转换。例如:
代码:
Declare f: Function(a)
Begin
Print("Hello, ", a);
End;
Declare a;
Set a=f;
Call a("Andrew"); 简单对象也可以转换为复合对象。例如:
代码:
Declare co: object
Begin
Declare a;
Declare b;
Declare func: Function
Begin
Print(b);
End;
End;
Declare o;
o.a = 1;
o.b = 2;
o.func = co.func;
call o.func;
co.b = 1;
call co.func; 2
1
当对一个对象赋值,而这个对象实际不存在的时候,PScript会自动创建一个合适的对象。最终结果就可以动态地改变一个对象中的成员。
评论总数 0
评论
发表评论 |
作者为 Innocentius 的最新文章
- 在使用Passport认证的网站返回401错误代码 (2006-11-23)
- 一个怪异的服务器问题 (2006-08-21)
- C++ XML 序列化器 (2006-08-04)
- sscli 2.0 简介 (2006-05-10)
- PScript 脚本(进一步的特征) (2006-04-18)




