运算符重载

只有抽象类型才能进行运算符重载

以下摘要基于 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 上的例子

参考