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("错误不会中断程序")

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容