数据类型
目录
基本类型
基本类型是AS数据类型的最基础类型,这些类型是其他类型的基础,一般其他编程语言中也有这些类型
基本类型不能
有引用
声明一个基本类型
//布尔型
bool boolean;
//整数型
int integer = 1;
//缺省型
void funciton()
{
//函数
}
缺省型
缺省型由void
关键词标记
实际上,缺省型并不应该被算作是一种数据类型,他更多的是表示数据类型的缺失
缺省型只能被用于告知编译器这个函数不返回任何值
布尔型
布尔型由bool
关键词标记
布尔型数值只可能拥有两种值true
或false
(真
或假
)
关键字true
和false
是bool
类型的常量,可以在表达式中使用
布尔型多用于进行逻辑判断
if(true)
{
//真
}
bool boolean = false;
if(boolean)
{
//假
}
整数型
整数型是一类数据类型,这些数据类型表示不同长度的有符号或无符号整数
整数型用多个带int
的关键词标记
整数型表如下
类型名称 | 关键词 | 最小值 | 最大值 | 备注 |
---|---|---|---|---|
有符号极短整型 | int8 | -128 | 127 | |
有符号短整型 | int16 | -32768 | 32767 | |
有符号整型 | int | -2147483648 | 2147483647 | 关键词隐藏了默认字节长度32,也可写为int32 |
有符号长整型 | int64 | -9223372036854775808 | 9223372036854775807 | |
无符号极短整型 | uint8 | 0 | 255 | |
无符号短整型 | uint16 | 0 | 65535 | |
无符号整型 | uint | 0 | 4294967295 | 关键词隐藏了默认字节长度32,也可写为uint32 |
无符号长整型 | uint64 | 0 | 18446744073709551615 |
相信很容易看出,不同类型的整数型后的数字代表了该类型的长度
如有符号极短整型是28
无符号整型是232
由于脚本引擎已针对32位类型进行了优化,因此只建议在访问应用程序指定的变量时使用较小的变量
对于局部变量,最好使用32位变量
实数型
实数型代表了任意的小数类型
实数型类型表如下
类型名称 | 关键词 | 数值范围 | 最小正值 | 最大精度 |
---|---|---|---|---|
单精度型 | float | ±3.402823466 x 1038 | 1.175494351x 10-38 | 6 |
双精度型 | double | ±1.79769313486231 x 10308 | 2.22507385850720x 10-308 | 15 |
注意
脚本假设运行脚本的平台使用了符合IEEE 754标准的CPU来呈现浮点数 (现代CPU基本都符合这个标准)
如果浮点数的精度超过了类型的规定的最大精度,将会对数值进行舍入操作,由此可能会引起一些列错误
其他:浮点还拥有几个特殊值
值 | 备注 |
---|---|
-0 | 负数0 |
+∞ | 正无穷 |
-∞ | 负无穷 |
NaN | 非数值,由32位数据字0x7fc00000表示 |
这些数值多用于错误的算式中的异常捕获,以防止如1÷0
之类的错误算式引起的内存错误
对象与句柄
对象
对象有两种形式,引用类型和数值类型
数值类型的行为与原始类型很相似,因为它们在堆栈上分配并在变量超出范围时被释放
只有程序可以注册这些类型,因此你需要查看程序文档来获取更多的信息
引用类型在堆栈上分配,如果脚本保留了对该实例的另外一个引用,引用类型可能比分配它们的初始变量长
所有脚本声明的类都是引用类型
接口是引用类型的一种特殊形式,无法实例化,但可用于访问实现接口的对象,而无需确切知道它是什么类型的对象
列如
//这样实例化一个对象
obj o;
//obj()创建一个临时实例
//随后将临时实例赋值给o
o = obj();
对象句柄
对象句柄是一种特殊类型,可用于保存对其他对象的引用
当调用方法或访问作为对象句柄的变量的属性时,可以直接访问句柄引用的实际对象,就像对象的别名一样
注意,除非使用对象的句柄已经初始化,否则句柄为空
obj o;
// 实例化了一个对象句柄,此时对象句柄为空
obj@ a;
//实例化了一个对象句柄,此对象句柄已经引用到了对象o
obj@ b = @o;
//通过这个对象句柄可以直接访问对象成员
b.ModifyMe();
//使用对象句柄之前一定要进行空句柄验证
if( a is null )
{
//对象句柄间可互相赋值
@a = @b;
}
并不是所有的类型都可以拥有对象句柄,比如基本类型就不能拥有句柄
而且可能会有一些对象不允许拥有句柄,具体那些对象不能拥有句柄取决于注册对象的脚本
详细内容可看对象与句柄
函数句柄
函数句柄是一种数据类型,可以动态设置为指向符合与变量声明定义的匹配函数签名的全局函数
函数句柄通常用于回调,即一段代码必须能够基于某些条件回调某些代码,但需要调用的代码在编译时未知
要使用函数句柄,首先需要在全局范围内定义或作为类成员使用的函数签名,完成后,即可使用该定义声明变量
列如
//这里声明了一个函数签名,只要传入一个Int参数,返回一个int值的函数均符合这个签名
funcdef int CALLBACK(int);
//定义一个函数,这个函数需要符合签名
int PlusOne(int value)
{
return value + 1;
}
//一个签名可以有多个不同的函数符合
int DesOne(int value)
{
return value - 1;
}
void Caculate()
{
//此处声明一个函数句柄,这个句柄指向了函数PlusOne
CALLBACK@ plusHandle = @PlusOne;
//同对象句柄一样,可直接通过函数句柄使用函数
plusHandle(5);//返回6
//句柄间可直接赋值
@plusHandle = @DesOne;
plusHandle(5);//返回4
//句柄可为空
@plusHandle = null;
//因此使用前必须进行空句柄检测
if(@plusHandle is null)
{
//不要了
}
}
委托
也可以对类方法使用函数句柄,但在这种情况下,类方法必须绑定到将用于调用的对象实例
这种绑定称为创建委托,并通过对声明的函数定义执行构造调用来完成,该函数定义将类方法作为参数传递
列如
class CApple
{
int count = 0;
int Buy(int value)
{
count += value;
return count;
}
}
void Shop()
{
//声明对象
CApple foo;
//为CApple内的类方法Buy创建委托
CALLBACK @buyone = CALLBACK(foo.Buy);
//如同正常的全局函数一样使用委托句柄
buyone(5);//返回6,foo中count成员变为6
}
字符串
注意
只要注册了字符串类型的程序才能在脚本中使用字符串,由于注册方法或注册内容的不同,不同程序使用字符串的方法可能会有所区别
根据应用程序的设置,字符串是一个字符或16位字的数组
通常字符串用于储存文字,但是字符串实际上可以储存任何二进制数据
AS支持两种类型的字符串常量:普通字符串和文档字符串,或者称为heredoc字符串
普通字符串包含在("
)(英文双引号)或('
)(英文单引号)之间
普通字符串中常用一些转义符号来表示一些无法直接打出的字符
转义符号永远以\
(右斜杆)开始
转义符号 | 值 | 代表的符号 | 描述 |
---|---|---|---|
\0 | 0 | 空字符 | |
\\|92 | \|右斜杆 | ||
\’ | 39 | ‘ | 单引号 |
\" | 34 | " | 双引号 |
\n | 10 | 键盘上那个回车键按下去出来的那个 | 换行,将从头新开一行 |
\r | 13 | 他是个代表换行的字符,你懂吧 | 回车,将光标向下移一行 |
\t | 9 | 键盘上按tab出来的那个 | 制表符 |
\xFFFF | 0xFFFF | 16位数值 | FFFF应该换成一个1到4位的十六进制数,表示所需的值。如果应用程序使用8位字符串,则只接受高达255的值 |
\uFFFF | 0xFFFF | unicode码表所对应的字符 | 应将FFFF替换为表示unicode码位的十六进制数 |
\UFFFFFFFF | 0xFFFFFFFF | unicode码表所对应的字符 | FFFFFFFF应替换为表示unicode码位的十六进制数 |
列如
string str1 = "\u5927\u6d77啊~\n\t\"你全是水~\"";
//显示出来效果如下
/**
大海啊~
"你全是水~"
**/
heredoc字符串是为包含大量文本而设计的,不会处理转义符号
heredoc字符串由三引号("""
)包围,可以跨越多行代码
如果字符串开始后直到第一个换行符为止的字符只包含空格,则编译器会自动将其删除
同样,如果最后一个换行符后面的字符直到字符串的结尾只包含空格,则也会删除
列如
string str1 = """
你,
一会看我,
一会看云。
我觉得,
你看我时很远,
你看云时很近
\n\t\r\u1234
""";
//显示出来效果如下
/**
你,
一会看我,
一会看云。
我觉得,
你看我时很远,
你看云时很近
\n\t\r\u1234
**/
如果多个字符串常量按顺序写入,并且它们之间只有空格或注释,编译器将会把它们连接在一起
列如
string str1 = "我是天空里的一片云\n" "偶然投影在你的波心\n"
"你不必讶异,更无须欢喜\n"
"在转瞬间消灭了踪影";
//等同于
string str2 = "我是天空里的一片云\n偶然投影在你的波心\n你不必讶异,更无须欢喜\n在转瞬间消灭了踪影";
转义序列u和U将根据应用程序设置将指定unicode为UTF-8或UTF-16
且只支持unicode 5.1
不接受U+D800和U+DFFF或U+10FFFF以上的数值
自动类型
可以使用auto
”`作为赋值样式变量声明的数据类型
将自动确定变量的适当类型
//声明整数
auto i = 114;
//声明实数
auto f = 514 + 1919.f;
//从返回值确认声明的字符串
auto o = getStringById(id);
//自动类型也可以用于声明常量
const auto j = 810;
//对于支持句柄的类型,auto将始终成为句柄,因为它比值赋值更有效
//d是一个object@
auto d = object();
//如果你想更明确一点,这也是允许的
auto@ a = object();
//自动句柄不能用于声明类成员,因为它们的解析依赖于构造函数
class CShit
{
//不可以
auto@ flavor = beast();
}
标准库类型
除了这几种类型外,AS标准运行库还添加了一些额外的数据类型,可参阅标准运行库