Kotlin数组初始化

4

2
相关:https://dev59.com/Z7Pma4cB1Zd3GeqPwc5q - Slaw
1
我在搜索中找到了这个链接,但我不会对此抱有太大期望。 - Bubletan
1
你是编译成字节码还是 JavaScript?我想这些实现方式可能会有所不同。如果你编译为 JavaScript,应该会有很多内置代码的 .js 文件。我建议你去那里看一看。 - Hullburg
@Hullburg 很好的问题。答案是:我不知道。我正在编写一个开源库。 - QED
2个回答

4

看看 Array的源代码:

public inline constructor(size: Int, init: (Int) -> T)
init 参数是一个函数,它接受一个 int 类型的参数(特定项目的索引),并期望返回数组中包含的类型 T 的值。如其他答案所示,这些按顺序调用,因为这是“自然”的方式。如果您不理解我的意思,请考虑实现的其他选择:
for (i in 0..size) {
    this.addToArray(init(i));
}

或者:

for (i in (size - 1)..0 {
    this.addToArray(init(i));
}

相比之下:

val indices = mutableListOf<Int>()
while (indices.size != size) {
    val i = random.nextInt(size); 
    if (i !in indices) {
        indices.add(i);
        this.addToArray(init(i));
    }
}

虽然我们不能看到构造函数的源代码,但其他答案中显示的例子表明它们不可能使用随机方法。应用来自第一个回答的代码,就数学而言,使用随机并按顺序打印0-49的几率极低。
此外,这里的一个答案也支持上述结论。生成的编译Java代码创建了一个从0到大小的for循环。对于JVM,假设它们不更改实现,可以认为它将从0到大小。但是无论它是从0到size还是从size到0,如果您不喜欢顺序,总是可以反转它。
如果您需要100%确定它从0到size,或者如果实现发生变化,您可以执行以下操作:
var a = (0 until 10).step(1).toList().toTypedArray()

在这种情况下,它会生成一个包含0-9数字的数组。
如果您想要对象,或者以其他方式更改对象,您可以在创建列表之前添加.map{}。尽管如此,只要init函数按预期工作,这也是一种过度的替代方法。
您始终可以使用IntelliJ、Android Studio、其他IDE或您选择的反编译器来反编译代码进行确认。但无论实现如何,它们总是按顺序结束 - 因此您不需要担心。它们唯一可能更改的是调用init函数的顺序,但最终它们仍将以相同的顺序出现在结果数组中。

感谢您的详细回答。您是正确的,似乎没有其他顺序之外的好理由来执行它。但这并不意味着没有人会想出其他方法 - 例如,有人可能决定并行枚举索引。这就是为什么API不做出保证,也是我不能依赖顺序初始化的原因。 - QED
好的回答,Olivia!恭喜你做出了出色的第一次贡献!你得到了我的+1。 - developer_hatch

0

你能链接到 <init> 代码吗? - QED
我创建了一个超链接。点击它没有反应吗?哦,是在这里吗?好的。 - Hullburg
我的意思是Kotlin Array :: init代码本身 - 某个地方必须有一个名为Array.kt的文件。 - QED
我明白了。很抱歉,我不知道在哪里找到那个。 - Hullburg
2
这并不保证在未来的版本和所有平台上它总是按顺序调用。除非文档有说明,否则我不会编写依赖于顺序的代码。 - gidds

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