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中加上就行了
}
}