翼度科技»论坛 编程开发 python 查看内容

aardio教程二) 进阶语法

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
表(table)

aardio中除了基础数据类型外,其他的复合对象都是table(例如类和名字空间等)。table可以用来存放aardio的任何对象,包括另一个table。
在其他语言中的字典、列表、数组、集合映射等,在aardio中都使用table来实现。
创建字典
  1. import console;
  2. var tab = {
  3.     a = 123;
  4.     str = "字符串";
  5.     [123] = "不符合变量命名规则的键应放在下标内。";
  6.     ["键 名"] = "不符合变量命名规则的键应放在下标内。";
  7.     键名 = {
  8.         test = "表也可以包含表";
  9.     }
  10. }
  11. // 新版也可以使用类json语法定义
  12. var tab = {
  13.     "a": 123,
  14.     "str": "字符串",
  15.     //123: "不符合变量命名规则的键应放在下标内。" // 这样定义键不能是数值类型
  16.     "键名": {"test":"表也可以包含表"}
  17. }
  18. tab.a = 456;
  19. tab["str"] = "aaaa" ;
  20. // 赋值为null等同于删除该键
  21. tab.键名 = null;
  22. // 遍历
  23. for k,v in tab{
  24.     console.dump(k,v);
  25. }
  26. console.pause();
复制代码
创建数组
  1. var array = {1;2;3;"a"};
  2. // 遍历
  3. for(i=1;#array;1){
  4.     console.dump(i, array[ i ]);
  5. }
复制代码
数组和字典可以混用
  1. var t = {
  2.     1;
  3.     2;
  4.     a=2;
  5. }
  6. // #只能获取到数组长度,也就是2
  7. console.log(#t)
  8. // 获取表长度, 3
  9. console.log(table.count(t))
复制代码


使用class关键字定义类。类可以动态创建数据结构相同的table对象
定义类
  1. //定义类
  2. class 类名字{
  3. //构造函数可以省略
  4. ctor( 构造参数列表 ){
  5.         //构造函数代码
  6. }
  7. 类属性 = "属性值";
  8. 类方法 = function(参数){
  9. }
  10. }
复制代码
和定义一个table的语法基本一样,只是类可以创建出对象
  1. var 对象 = 类名字();
  2. io.print(对象.类属性)
  3. 对象.类方法();
复制代码
类的名字空间

定义类时,默认会创建一个同名的名字空间。赋值给名字空间的变量就是类的公用静态成员
  1. io.open(); //打开控制台窗口
  2. //定义一个类
  3. class cls{
  4.     a = 123;
  5. }  
  6. //每一个类拥有独立的名字空间,名字空间中的变量也就是类的公用静态成员。
  7. cls.A = "类的静态成员A";
  8. c = cls(); //创建新对象
  9. io.print( "c.a" , c.a ) //显示123
  10. io.print( "cls.A" , cls.A ) //显示"类的静态成员A";
复制代码
在库代码里可以经常看到,定义类的时候一般会定义一个同名的名字空间,用于存放一些静态函数或变量
  1. class base{
  2.     a = 123;
  3.     b = 456;
  4.     c = 789
  5. }
  6. namespace base{
  7.     static = 123; //类的静态成员
  8. }
复制代码
this对象

也就是Python的self,表示当前对象
owner对象

这个解释起来比较麻烦,但理解了就很简单,举个例子:
  1. class cls{
  2.         func = function(){
  3.                 //类有自已的名字空间,访问全局对象要加上..前缀
  4.                
  5.                 ..io.print("owner", owner  )
  6.                 ..io.print("this", this )
  7.                 ..io.print("owner == this", owner == this  )
  8.         }
  9.        
  10. }
  11. //创建对象
  12. obj = cls();
  13. //打开控制台
  14. io.open()
  15. //调用对象方法
  16. obj.func(); //默认table与owner是同一个对象
  17. func = obj.func;
  18. func();//这里owner为null空值,而this对象没有改变
复制代码
当一个table对象调用成员函数时,默认会传递一个owner对象给函数。而在类创建的对象成员函数里,owner对象与this对象是指向同一个对象。
this对象与owner对象的区别在于: this是类内部指向当前创建对象的指针,this指针不会因为函数的table前缀改变而改变。而owner对象是会根据函数调用时函数名前缀的table对象而相应改变
构造函数

ctor函数就是类的构造函数,等同于__init__,只是参数没有self
  1. //定义类
  2. class cls{
  3.    
  4.     //使用ctor关键字定义构造函数
  5.     ctor( a,b ){
  6.         this.a = a;
  7.         this.b = b;
  8.     }
  9.     c = "this.c";
  10.     d = "this.d";
  11. }
  12. //调用类的构造函数创建对象
  13. var obj = cls(123,456);
  14. import console;
  15. console.log( obj.a, obj.b )
  16. console.pause();
复制代码
类的直接继承
  1. //创建一个基类 class base{
  2.     a = 123;
  3.     b = 456;
  4.     c = 789
  5. }
  6. namespace base{
  7.     static = 123; //类的静态成员
  8. }class inheritance{        // 构造函数,三个点表示可变参数,类似Python的*args    ctor(...){         // 在类函数里访问其他名字空间前面都需要加上.., 内核库也要,比如..string.format        this = ..base(...); //调用基类构造对象原型。    };        c = "覆盖基类成员";    d = "子类的新成员";}import console;var obj = inheritance();//从子类创建对象//输出对象的所有成员(包括直接继承的基类成员)for(k,v in obj){    console.log(k,v);}console.pause();
复制代码
类的间接继承
  1. class base{
  2.    a = 123;
  3.    b = 456;
  4.    c = 789
  5. }
  6. class inheritance{
  7.     c = "覆盖基类成员";
  8.     d = "子类的新成员";
  9.     // @表示类的元表,名称是随意的
  10.     @_prototype;
  11. }
  12. // 在类的名字空间内指定静态共享成员 _prototype
  13. // 可以在元表中定义相应的元方法,来改变类的一些行为,比如_get是访问类属性时触发
  14. inheritance._prototype =  { _get = ..base() };
  15.    
  16. import console;
  17. var obj = inheritance();//从子类创建对象
  18. //与类的直接继承不同
  19. //遍历只能输出子类的所有对象,(不会遍历元表中原型对象的成员)
  20. for(k,v in obj){
  21.     console.log(k,v);
  22. }
  23. //通过元方法继承仅在使用成员操作符时生效
  24. console.log("访问base类的成员", obj.a );
  25. console.pause();
复制代码
类的私有成员

用var定义的成员变量,作用域只在类里面,所以外部无法访问
类的只读成员

用下划线开头的变量为类的只读成员,无法修改它。也可以通过元表来定义只读成员,元表和元方法的时候再具体说
本文由博客一文多发平台 OpenWrite 发布!

来源:https://www.cnblogs.com/kanadeblisst/p/18079323
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具