Haxe получить массив последний элемент - PullRequest
1 голос
/ 04 апреля 2020

В haxe есть какой-нибудь способ получить последний элемент массива, кроме использования arr[arr.length-1] в качестве ключа? Я хотел бы избежать ссылки на массив.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

Нет, но вы можете создать для него stati c расширение :

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;
    }
}

Недостатком является то, что массив должен быть напечатан как абстрактный.

0 голосов
/ 04 апреля 2020

Два неясных способа достижения аналога, решения 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);
    }
}
...