gpt4 book ai didi

kotlin - kotlin…ArrayOf范围界定问题

转载 作者:行者123 更新时间:2023-12-02 13:21:13 25 4
gpt4 key购买 nike

为什么下面的第一个代码示例会编译,而第二个代码却失败。唯一的变化是我将涉及的val从文件范围移到了类范围。 longArrayOf(...)创建一个LongArray,对吗?
编译没有问题:

val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
class TestLongArrayOf {
enum class BuzzType(val pattern: LongArray) {
CORRECT(CORRECT_BUZZ_PATTERN)
}
}

出现消息“未解析的引用CORRECT_BUZZ_PATTERN”失败
class TestLongArrayOf {
val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
enum class BuzzType(val pattern: LongArray) {
CORRECT(CORRECT_BUZZ_PATTERN)
}
}

最佳答案

主要区别在于,在第一种情况下,CORRECT_BUZZ_PATTERN是在类外部定义的,并且被视为只读变量(可通过其getter访问),而在第二个片段中,它是只读的实例变量,因此不能用作常数。
但是,此代码将起作用:

class TestLongArrayOf {
val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
enum class BuzzType(val pattern: LongArray) {
CORRECT(TestLongArrayOf().CORRECT_BUZZ_PATTERN)
}
}

让我们看一下生成的字节码。在第一种情况下,您具有:
public final class MainKt {
private final static long[] CORRECT_BUZZ_PATTERN
public final static long[] getCORRECT_BUZZ_PATTERN() {
...
}
static {
// initialize CORRECT_BUZZ_PATTERN here
...
}
}

public final enum TestLongArrayOf$BuzzType {
...
}

因此,CORRECT_BUZZ_PATTERN是属于 static final类的 MainKt数组,可以通过其getter对其进行访问。

在第二种情况下,您得到的是:
public final class TestLongArrayOf {
private final long[] CORRECT_BUZZ_PATTERN

public final long[] getCORRECT_BUZZ_PATTERN() {
...
}
}

public final enum TestLongArrayOf$BuzzType {
...
}

请注意,在这种情况下, CORRECT_BUZZ_PATTERN是一个实例变量,可以通过其getter进行检索。但是,由于它是一个实例变量,因此必须在 TestLongArrayOf实例上调用getter,这就是为什么我的答案顶部的代码段有效的原因。

关于kotlin - kotlin…ArrayOf范围界定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316036/

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