在haxe中,除了使用
arr[arr.length-1]
作为键来获取数组的最后一个元素之外,是否还有其他方法?我想避免需要对数组进行引用。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,但通常最好将其设置为有效的值,在某些目标中,您可能需要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);
}
}
var thing = someFunction().last()
,而不需要先将整个数组存储在某个临时变量中以获取长度。 - blues