Haxe获取数组最后一个元素

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

我想避免需要对数组进行引用。这是有特定原因吗?无论如何,似乎你都需要一个引用:否则你怎么能访问数组呢? - Chii
1
@Chii 当数组从函数返回时,我只关心最后一个元素。使用gamas的解决方案,我可以这样做var thing = someFunction().last(),而不需要先将整个数组存储在某个临时变量中以获取长度。 - blues
2个回答

7
不行,但您可以创建一个静态扩展来实现它。
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;
    }
}

这种方法的缺点是数组必须被标记为抽象类型。

-1

有两种不常用的方法可以实现类似的功能,Gama11解决方案似乎更好,但如果速度很重要,始终要检查目标上的速度。我在js测试中使用了null,但通常最好将其设置为有效的值,在某些目标中,您可能需要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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接