haxe的Abstract数据类型(二)

Haxe语言呢,在这块地方确实有点复杂,毕竟为了适配多种语言而生的,把几种语言的难点汇集在一起,初学是有难度的,但是咬牙过了这个坎,下面就一片坦途了,毕竟实在像极了java,C#。想想比学js受的害其实还是要少多了。实在不行这块先略过,等学出了感觉再回头看。学编程语言和学自然语言是一样的,比方一个生僻的成语,理解意思了,但是不懂应该怎么用,那就先略过,要表达这个成语的时候,换个长句子表达也是一样的,等后面语言纯熟了,再想法子用成语,进一步提高语言修养。

------------------------------------------------------------

回头说Abstract类型的数组访问(Array access)

数组访问,用的是下标,比方a[1],a[2],只允许使用int类型的参数。不过,使用abstracts可以定义自定义数组访问方法。

在haxe标准库中使用在Map类型访问中。

下一个例子,实现了string类型向数组类型访问的实例,(插句题外话:在python中,字符串本身也是迭代类型,可以直接使用下标当数组使用,但在haxe中不行,得自己实现,怎么实现?如下)。

abstract AString(String) {
  public function new(s) this = s;
  @:arrayAccess function getInt1(k:Int) {
    return this.charAt(k);
  }
  @:arrayAccess function getInt2(k:Int) {
    return this.charAt(k).toUpperCase();
  }
}

class Main {
  static function main() {
    var a = new AString("foo");
    trace(a[0]); // f
  }
}
-----------
//getInt1和getInt2当然不会同时工作,只是方便演示,把getInt1注释掉了,getInt2就工作了

下一个坑:Enum abstracts

通过@:enum 增强Enum

abstract HttpStatus(Int) {
  var NotFound = 404;
  var MethodNotAllowed = 405;
}

class Main {
  static public function main() {
    var status = HttpStatus.NotFound;
    var msg = printStatus(status);
  }

  static function printStatus(status:HttpStatus) {
    return switch(status) {
      case NotFound:
        "Not found";
      case MethodNotAllowed:
        "Method not allowed";
    }
  }
}

这个没啥难理解的,反正就是加强代码阅读性。

下一个神坑:转发元方法(Forwarding abstract fields)

这个东西没啥难的,就是Haxe 3.1之后增加了这个元方法,去限定自定义的Abstract类型的操作,例子:

@:forward(push, pop)
abstract MyArray<S>(Array<S>) {
  public inline function new() {
    this = [];
  }
}

class Main {
  static public function main() {
    var myArray = new MyArray();
    myArray.push(12);
    myArray.pop();
    // MyArray<Int> has no field length
    myArray.length; //这边就报错了,因为 forward限定了就两个方法push,pop,没length,
//如果要用length的话,就在forward中加上就行了
  }
}

猜你喜欢

转载自blog.csdn.net/keniv/article/details/88308915