文档地址:https://www.hongqiye.com/doc/aardio/#/
数据类型
- null: 空值
- boolean: 布尔值
- number: 数值
- string: 字符串
- table: 类似有序字典,但可以没有键,只有值(此时键即为下标索引)
- function:函数
- pointer: 普通指针
- buffer:缓冲区指针
- cdata: 内核对象
- fiber:纤程,微软Windows中的命名,和协程类似
- class:类
查看变量类型: type(obj), 判断两个变量类型是否相同:type.eq(obj1, obj2)
字符串
转义和其他语言基本一样,例如\n, \t等
被/**/包裹的字符串中的换行为\r\n, 单引号中不包含换行,双引号包含的是\n,比如:
str = "我后面是换行符
我前面是换行符"
str = '我后面没有换行符
我前面没有换行符'
特殊字符串
var wstr = 'UTF16字符串'u;
var a = 'A'#; //表示65,即字符A的ASCII值
var file = $"/test.jpg"; //表示将文件读取为二进制并赋值给file
操作符
基本同其他语言类似,说几个不一样的
- ++:可将不同类型强制转换后连接成字符串
- [[]]: 同[], 只在特定条件下与[]不同
- #:取长度,#'aaaa’的值为4
?:
: 三元操作符,与其他语言不同。a?b:c的三元表达式时,如果a为真但是b为false,返回的是c的原值。因为?表示为逻辑与。即a?b和a and b一样
运算符重载
这是针对table类型的运算
加法重载如下:
io.open();
tab = { x=10 ; y=20 };
tab2 = { x=12 ; y=22 }
//c = tab + tab2; //这样肯定会出错,因为 table默认是不能相加的
//创建一个元素,元表中的__add函数重载加运算符。
tab@ = {
_add = function(b) begin
return owner.x + b.x
end;
}
c = tab + tab2; //这时候会调用重载的操作符 tab@._add(tab2)
io.print( c ) //显示22
这里只重载了tab的加法运算就可以进行tab+tab2,不过tab2+tab依旧可以运算。对于某些元方法我们需要重载两个对象。比如判断相等_eq
元方法
- _weak: 没懂,和弱引用有关
- _type: 当type()时调用,可以指定自定义类型
- _defined: 当table.eachName()等,返回对象的预定义已排序键名
- _keys: table.keys等,返回键列表
- _startIndex: table.eachIndex等,指定数组的开始下标
- _get = function(k,ownerCall) {}: 当被[]时,k为键,ownerCall为true时返回函数
- _set = function(k,v) {}: 使用[]赋值时,k, v为键,值
- _eq = function(b){}: ==,b为要比较的对象,且b的元方法必须和a一样
- _le = function(b){}: >=, <=, b为要比较的对象,且b的元方法必须和a一样
- _lt = function(b){}: <, >, b为要比较的对象,且b的元方法必须和a一样
- _add = function(b){}: +
- _sub = function(b){}: -
- _mul = function(b){}: *
- _div = function(b){}: /
- _lshift = function(b){}: <<
- _rshift = function(b){}: >>
- _mod = function(b){}: %
- _pow = function(b){}: **
- _unm = function(b){}: -
- _len = function(b){}: #
- _concat = function(b){}: ++
- _call = function(b){}: 函数调用()
语句
赋值:
var a = 1;
var a, b, c = 1, 2, 3;
var a, b, c = table.unpack({1, 2, 3})
将table中的变量赋值为null表示删除这个元素
条件判断
if elseif else
select case
循环
while
- while(条件判断语句) {}
- while(var 初始化循环变量列表;判断条件前执行语句;条件判断语句){}
do while
do{} while(条件判断语句);
for
for( 计数器变量= 初始数值; 最大数值; 步进数值){} //步进数值省略默认为1
for in
同python,可以遍历table和迭代器
break
可以指定循环层数,比如break 2;表示上上层循环,不指定则默认1即当前循环,也可以指定标号来break 标号;结束指定循环
例如:
io.open(); //打开控制台
while( true ){ 循环体2: //可以在循环体的开始指定一个标号
io.print("循环体2开始" );
while( true )begin
io.print("循环体1开始" );
break 2;//中断上层循环
break 循环体2; //这句的作用与上面的break作用是一样的
io.print("循环体1结束" );
end;
io.print("循环体2结束" );
}
execute("pause") //按任意键继续
io.close();//关闭控制台
continue