在数组的构造函数中,是否可以保证索引的递增顺序将调用init函数?
这是有道理的,但我没有在文档中找到任何此类信息: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/-init-.html#kotlin.Array%24%28kotlin.Int%2C + kotlin.Function1%28%28kotlin.Int%2C + kotlin.Array.T%29%29%29%2Finit
答案 0 :(得分:4)
API中对此不做任何保证。
TLDR:如果您需要顺序执行,因为您的状态有所变化,请参见底部。
首先让我们看一下初始化程序的实现:
本机:对于Kotlin Native,它以递增顺序实施。
@InlineConstructor
public constructor(size: Int, init: (Int) -> Char): this(size) {
for (i in 0..size - 1) {
this[i] = init(i)
}
}
JVM :反编译
的Kotlin字节码class test {
val intArray = IntArray(100) { it * 2 }
}
在Android Studio中使用Java产生的收益:
public final class test {
@NotNull
private final int[] intArray;
@NotNull
public final int[] getIntArray() {
return this.intArray;
}
public test() {
int size$iv = 100;
int[] result$iv = new int[size$iv];
int i$iv = 0;
for(int var4 = result$iv.length; i$iv < var4; ++i$iv) {
int var6 = false;
int var11 = i$iv * 2;
result$iv[i$iv] = var11;
}
this.intArray = result$iv;
}
}
支持声称它以升序初始化的说法。
结论:通常实现为以升序执行。
但是::您不能依赖执行顺序,因为API不能保证实现。它可能会发生变化,并且对于不同的平台它可能会有所不同(尽管两者均不太可能)。
解决方案::您可以在循环中手动初始化数组,然后可以控制执行顺序。 以下示例概述了可能的实现方式,该实现方式具有稳定的初始化值,并带有随机值,例如进行测试。
val intArray = IntArray(100).also {
val random = Random(0)
for (index in it.indices) {
it[index] = index * random.nextInt()
}
}
答案 1 :(得分:1)
从版本1.3.50开始,Kotlin在其API文档中保证了顺序数组初始化的顺序:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/-init-.html
从第一个数组元素开始依次为每个数组元素调用函数
init
。它应返回给定索引的数组元素的值。