運算子過載

只有抽象型別才能進行運算子過載

以下摘要基於 Array<Int> 型別定義了 Vec2i 型別。這是一個帶有整數值的雙分量向量。我的 @:op 編譯器後設資料 可以實現運算子過載。只有可用的數字運算子可以過載 - 不允許指定自定義運算子。

abstract Vec2i(Array<Int>) {
    public inline function getX() : Int {
        return this[0];
    }
    
    public inline function getY() : Int {
        return this[1];
    }
    
    public inline function new(x : Int, y : Int) {
        this = [x, y];
    }
    
    @:op(A + B)
    public inline function add(B : Vec2i) : Vec2i {
        return new Vec2i(
            getX() + B.getX(),
            getY() + B.getY()
        );
    }
}

使用摘要如下。

var v1 = new Vec2i(1, 2);
var v2 = new Vec2i(3, 4);
v1 + v2;
v1.add(v2);

試試 try.haxe.org 上的例子

參考