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;
}
}