gpt4 book ai didi

arrays - Kotlin 数组初始化中 init 调用的顺序

转载 作者:行者123 更新时间:2023-12-02 02:30:28 27 4
gpt4 key购买 nike

在数组的构造函数中,是否可以保证以递增的顺序为索引调用 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

最佳答案

API 对此不提供任何保证。

TLDR:如果您需要顺序执行,因为您有一些状态会发生变化,请参见底部。

首先让我们看一下初始化器的实现:

native :它是按升序实现的 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()
}
}

关于arrays - Kotlin 数组初始化中 init 调用的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56091276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com