Haxe的结构体与匿名结构体

1、创建一个匿名结构体:
  var myStructure = { x: 12, name: "foo"};

2、创建一个复合匿名结构体:

var user = {
  name : "Nicolas",
    age : 32,
    pos : [
      { x : 0, y : 0 },
        { x : 1, y : -1 }
  ],
};

有了这两步,还可以搞出更多的花样,比如定义一个变量为结构体:

 var start : { x : Int, y : Int };
 var target : { x : Int, y : Int };
 var current : { x : Int, y : Int };

引入typedef

typedef Point = { x : Int, y : Int }

class Path {
    var start : Point;
    var target : Point;
    var current : Point;
}

甚至匿名结构体还可以继承:

typedef Point3 = { > Point, z : Int } //这样就多了一个z的成员

为了适配js,甚至可以引入字符串作为key例如:

var point = { "x" : 1, "y" : -5 };

也可以用类的方式定义结构体:

typedef Point = {
    var x : Int;
    var y : Int;
}

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

结构体的可选项:

typedef User = {
  age : Int,
  name : String,
  ?phoneNumber : String
}

用元数据的方式定义可选项:

typedef User = {
  var age : Int;
  var name : String;
  @:optional var phoneNumber : String;
}

-----------

最后放个大招:就是结构体的动态扩展。动态扩展是动态语言的妙曼之处。直接上官方教程的例子。

typedef IterableWithLength<T> = {
  > Iterable<T>,
  // read only property
  var length(default, null):Int;
}

class Main {
  static public function main() {
    var array = [1, 2, 3];
    var t:IterableWithLength<Int> = array;
    trace(t.length);//这里的输出结果是3。
  }
}

直接扩展出一个length属性,这个方法本身就是数组的属性,可以绑定成结构体。

还有3.1之后还有更有意思的东西,这个呢就是动态的语言的精华所在,其他动态语言如aardio用的原型类扩展功能,而Haxe通过结构体也能做到,但我更觉得原型链扩展更好更强大。可能haxe还有其他扩展功能的途径,只是暂时我不知道罢了。官方例子如下:

typedef WithLength = {
  var length(default, null):Int;
}

typedef IterableWithLengthAndPush<T> = {
  > Iterable<T>,
  > WithLength,
  function push(a:T):Int;
}

class Main {
  static public function main() {
    var array = [1, 2, 3];
    var t:IterableWithLengthAndPush<Int> = array;
  }
}

猜你喜欢

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