Haxe 获取数组最后一个元素

Haxe get array last element

在 haxe 中,除了使用 arr[arr.length-1] 作为键之外,还有其他方法可以获取数组的最后一个元素吗?我想避免需要对数组的引用。

不,但您可以为其创建一个 static extension

using ArrayExtensions;

class Main {
    static function main() {
        var a = [1, 2, 3];
        trace(a.last()); // 3
    }
}
class ArrayExtensions {
    public static inline function last<T>(a:Array<T>):T {
        return a[a.length - 1];
    }
}

或者,您可以使用自定义抽象重载数组访问运算符以获得 Python 样式的负索引:

class Main {
    static function main() {
        var a:PythonArray<Int> = [1, 2, 3];
        trace(a[-1]); // 3
    }
}

@:forward
abstract PythonArray<T>(Array<T>) from Array<T> to Array<T> {
    @:arrayAccess function get(i) {
        return if (i < 0) this[this.length - i * -1] else this[i];
    }

    @:arrayAccess function set(i, v) {
        return if (i < 0) this[this.length - i * -1] = v else this[i] = v;
    }
}

这有一个缺点,那就是必须将数组键入为该抽象。

实现相似的两种模糊方法,Gama11 解决方案似乎更好,但如果它很重要,请始终检查目标上的速度,我在 js 测试中使用了 null,但通常最好设置为有效值,您可能需要一些目标为空或类似。

using Test;
class Test {
    static function main() {
        var arr = [0,1,2,3];
        trace( arr.last() );
    }
    static inline function last<T>( arr: Array<T>, j=null ){
        for( i in arr ) j = i;
        return j;
    }
}

这似乎创建了更冗长的代码。

class Test {
    static function main() {
        var arr = [0,1,2,3];
        var j = null;
        arr.map((i)->j=i);
        trace(j);
    }
}