下面是为了防止内容太空直接从wolai复制过来的,因为wolai是一个块编辑器,所以没有格式不过我可以放出链接,大家想看笔记的可以自己去看看
wolai网站版(实时更新)
字符串
包含字符串
包含字符串用于将一个文件直接嵌入aardio代码中,并加载为一个二进制字符串。 例如:
var str = $"/test/test.jpg"
在aardio程序编译发布以后,该文件就会直接被编译到aardio代码中,不再需要原来的文件也可以运行。
表
创建一个表
创建一个空的表
var days = {}
创建一个table数组
var days = { "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" }
//days[1] 的内容是 "Sunday";days[2]的内容就是"Monday"......
//table元素可以使用各种数据类型的变量,甚至可以是一个表达式或者一个函数,如果我们为table中的值赋于一个键名字,则在table中添加一个键值对。
point = { x=100 ; y=200 }
//point.x 的值是100;point.y 的值是200
解包一个表(unpack)
//我们可以把多个变量用一对花括号包含起来以转换为table数组,也可以通过table.unpack函数将table数组转换为多个变量。
var tab = {"a";"abc";"abcd"} ; //创建一个table;
a,b,c = table.unpack(tab);
var tab2 ={ table.unpack(tab) }; //将所有返回值转换为table变量tab2
遍历表中的元素
和python一样,使用 for k,v in tab
就可以遍历
import console;
var tab = { a111="字符串"; b2=123; c="字符串2"; d=23; e=56; 78; 99; 123; 0 }
for k,v in tab {
/*
k为键,v是匹配的值,
在这里键值并不会按上面创建表的键值顺序输出
*/
console.log(k,v);
};
console.pause(true);
// 如果遍历的是数列
var days = { "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" }
for i in days{
console.log(days[i]);// 如果这里填的是i而不是days[i]的话,最后只能拿到1-7
}
关于表的一些其他知识
在新版的arrdio当中,支持python字典的写法,可以使用{"键":"值"}的方法,调用tag["键"],也可以写成tag.键
tab["x"] = 200; 也可以写为 tab.x = 200;
tab.x = null; //删除tab.x
使用#array获取数组的长度
var days = { "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" }
console.log(#day)// 输出7
//如果是字典和数列混用(arrdio有点猛)就只会拿到数列的长度
var array = {
a="字符串";b=123;c="字符串2";d=23;e=56;
78; 99; 123; 0
}
console.log(#array)// 输出4
函数(与javascript类似)
定义一个函数
function 函数名字(形参,形参2,...) {
//函数内部代码
//多个返回值以逗号分隔,如果省略return语句,函数默认返回null空值。
return 返回值,返回值2;
}
局部函数
函数也可以作为局部变量。局部函数像局部变量一样作用域限于当前语句块。
var function 局部函数名字(形参,形参2,...) {
//函数内部代码
//多个返回值以逗号分隔,如果省略return语句,函数默认返回null空值。
return 返回值,返回值2;
}
函数的递归
当局部函数递归调用自身时,因为定义函数时是先创建函数、然后指定局部变量名,因此在局部函数体中并不知道自已的名字是一个局部变量,这样导致局部函数在函数体内部不认识自已的名字。
var 递归 = function ( 计数 ){
if ( 计数 <= 0 )
return 计数
else
return 递归( 计数-1 ) // 出错了找不到函数名字"递归"
}
//调用递归函数
递归( 5 )
解决办法:
//在定义函数以前声明局部变量名字
var 递归;
//然后再定义函数体
递归 = function ( 计数 ){
if ( 计数 <= 0 )
return 计数
else
return 递归( 计数-1 ) // 找到函数名字"递归"
}
io.open()
//调用递归函数
io.print( 递归( 5 ) )
class
定义一个类
在类当中访问全局变量需要加上..前缀
//定义类
class 类名字{
//构造函数可以省略
ctor( 构造参数列表 ){
//构造函数代码
}
类属性 = "属性值";
类方法 = function(参数){
}
}
class cls{
a = 123;
func = function(){
//类有自已的名字空间,访问全局对象要加上..前缀
..io.print("我是对象内部的成员函数")
}
}
//创建对象
obj = cls();
obj2 = cls();
io.open()
//访问对象属性
io.print( obj.a )
//调用对象方法
obj2.func();
this对象(与JAVA类似)
在类内部,可以使用this对象引用动态创建的对象。
class cls{
a = 123;
func = function(){
//类有自已的名字空间,访问全局对象要加上..前缀
..io.open()
..io.print( this.a )
}
}
//创建对象
obj = cls();
//调用对象方法
obj.func();
构造函数(类似python的init)
使用ctor关键字定义构造函数,构造函数在调用类创建对象时被调用。
构造函数可以接收参数,并返回对象。
定义构造函数除了用ctor关键字代替function关键字以外,与定义函数的语法一致。
//定义类
class cls{
//使用ctor关键字定义构造函数
ctor( a,b ){
this.a = a;
this.b = b;
}
c = "this.c";
d = "this.d";
}
//调用类的构造函数创建对象
var obj = cls(123,456);
import console;
console.log( obj.a, obj.b )
console.pause();
类的继承
类的继承需要在ctor构造函数里面继承
//创建一个基类
class base{
a = 123;
b = 456;
c = 789
}
namespace base{
static = 123; //类的静态成员
}
class inheritance{
//构造函数
ctor(){
this = ..base(); //调用基类构造对象原型。
};
c = "覆盖基类成员";
d = "子类的新成员";
}
import console;
var obj = inheritance();//从子类创建对象
//输出对象的所有成员(包括直接继承的基类成员)
for(k,v in obj){
console.log(k,v);
}
console.pause();
强制类型转换
aardio提供三个强制转换动态类型的函数
-
tostring(v)
转换参数v为字符串,可使用_tostring元方法自定义转换函数。 -
tonumber(v)
转换参数v为数值,忽略首尾空白字符,可使用 _tonumber 元方法自定义转换函数。 -
topointer(v)
转换参数v为指针,可使用_topointer元方法自定义转换函数。
io.open(); //打开控制台窗口,用来支持io.print函数
n = tonumber( "2" );//tonumber函数强制转换一个变量为数字,如果失败返回null空值
str = tostring( 2 );//强制转换一个变量为字符串,如果失败返回null空值
ptr = topointer( 123 ); //强制转换为指针,如果失败返回null空值
io.print( type(n),type(str),type(ptr) );
execute("pause")
另外,使用2个逻辑非操作符可以将任何值转换为布尔值,例如:
var num = 0;
import console
console.log( !!num )
console.pause()
在算术运算中,字符串会尝试转换为数值,转换失败则抛出异常。
要注意字符串在自动转换为数值时,忽略首尾空白字符,空白字符串会转换为 0,而 tonumber 函数会将空白字符串转换为 null。而且 tonumber 函数会调用 _tonumber 元主法,但自动转换忽略 _tonumber 元主法。
import console;
console.log( ("") + ('\r\n\t ') + 0 ); //显示 0
console.log( tonumber("") === null ); //显示 true
console.pause(true);
在字符串连接操作时,数值会自动转换为字符串。
**要特别注意字符串的字面值两侧的 + 会自动转换为 ++。 **
例如 "1" + 0 会自动转换为 "1" ++ 0 做字符串连接操作,但 ("1") + 0 会执行加法运算。
使用type.eq比较数据类型
eq = type.eq( obj,obj2 )
单目运算符
! | 4 | 左向右 | 逻辑非 |
not | 5 | 左向右 | 逻辑非 |
- | 6 | 左向右 | 取负 |
~ | 7 | 左向右 | ~ 按位取反 |
算术运算符
操作符 | 优先级 | 结合 | 说明 |
---|---|---|---|
*乘 /除 %取模 | 8 | 左向右 | |
+加 -减 | 9 | 左向右 | |
** | 3 | 右向左 | 乘方 |
连接运算符
操作符 | 优先级 | 结合 | 说明 |
---|---|---|---|
++ | 12 | 右向左 | 连接运算符 |
逻辑运算符
操作符 | 优先级 | 结合 | 说明 | |
---|---|---|---|---|
== != === !=== | 14 | 左向右 | 等于、不等于、恒等、非恒等于 | |
&& and | 15 | 左向右 | 逻辑与 | |
or | 16 | 左向右 | 逻辑或 | |
? | 17 | 左向右 | 逻辑与、该运算符类似于and但优先级更低 | |
: | 18 | 左向右 | 逻辑或、该运算符类似于or但优先级更低 |
条件判断语句
条件判断语句if
创建一个条件判断语句
if(b==1){
if(a==1) begin
io.print("if")
end
}
elseif(a==11){
io.print("elseif")
}
else{
io.print("else")
}
select语句(Switch语句)
select指定一个选择器变量或表达式,case语句列举不同的值或条件值,第一个符合条件的case语句将会执行(执行第一个符合条件的case语句以后退出select语句,不会执行多个case语句)。
case 1,9,10 { //判断 a 是否其中的一个
case 10;20 { //判断 ( 10<=a and a <=20 ) 是否为真
case !=0{ //判断 a是否不等于0,这是自已指定关系运算符的示例
else{ //所有条件不符时执行else语句块
var a = 0;
select( a ) {
case 1 { //判断 1===a 是否为真
io.print("a==1")
//其他代码
}
case 1,9,10 { //判断 a 是否其中的一个
io.print("a是1,9,10其中之一")
}
case 10;20 { //判断 ( 10<=a and a <=20 ) 是否为真
io.print("a在10到20的范围")
}
case !=0{ //判断 a是否不等于0,这是自已指定关系运算符的示例
io.print("a不等于0")
}
else{ //所有条件不符时执行else语句块
io.print("a是其他值(0)")
}
}
循环语句
while循环(与JAVA和C类似)
while( var 初始化循环变量列表;判断条件前执行语句;条件判断语句 ) {
//需要循环执行的语句
}
var countLoop = 0
while( countLoop<10 /*这里指定进入并重复执行循环语句的条件*/ ){
countLoop++
io.print("循环次数", countLoop);
};
do...while条件循环语句
语法如下:
do{
//需要循环执行的语句
} while( 条件判断语句
下面是do..while语句示例:
do{
io.print(countLoop)
countLoop++
}while( countLoop<123 ); //判断条件
for计数循环语句
for( 计数器变量= 初始数值; 最大数值; 步进数值) { //步进可以省略,默认值为1。
//需要循环执行的语句
}
for( i=1;10;2 ){ //计数器i从1循环到10,每次递增2
io.print(i)
}
//支持修改计数器变量
for( i=1;10;1 )begin
i++;//如果你将i赋值为非数字,在下次循环以前将会被自动恢复为计数器值
end;
//递减计数器
for( i=1;-10;-1 )begin
io.print(i)
end;
execute("pause") //按任意键继续
io.close();//关闭控制台
迭代器
迭代器简单的讲就是在for in语句中用于循环取值的函数,下面是一个最简单的例子:
import console;
var days = { "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" }
for i in days{
console.log(days[i]);
}
console.pause(true);
import console;
/*
创建一个迭代器函数,
迭代器接受一个参数,返回一个或多个值
*/
var 迭代器 = function(控制变量){
if(!控制变量) return 1;
if(控制变量<10) return 控制变量+1;//第一个返回值、作为下一次调用迭代器的参数
}
//在for语句中循环调用迭代器函数,直到迭代器返回空值
for( 反馈结果 in 迭代器 ){ //for语句这对圆括号也可以省略
console.log(反馈结果)
}
console.pause(true);
try...catch容错语句
try语句尝试执行一个语句块,遇到错误则退出try语句块而不是中断aardio程序。
如果使用了catch语句块就可以捕获异常(catch语句块是可选的)。
try语句块、catch语句块即可以使用{ }标记语句块
io.open(); //打开控制台窗口
try{
b="aaaaaaaaaaaa" *2
io.print("错误会中断try语句块")
}
catch(e){ //catch部分可以省略
io.print( "错误信息:",e )
//在这里可以调用debug库
//在栈释放以前调用错误处理
//所以可以调用debug库中的函数收集错误相关的信息
}
io.print("错误不会中断程序")