Class2-arrdio基础数据类型

下面是为了防止内容太空直接从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("错误不会中断程序")

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容