kotlin - kotlin…ArrayOf范围界定问题

标签 kotlin scoping

为什么下面的第一个代码示例会编译,而第二个代码却失败。唯一的变化是我将涉及的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/

相关文章:

gradle - 我无法使用 kotlin 修复 Spring 项目中的错误。请告诉我这些错误的原因

javascript - Node.js 中低于全局范围的范围

javascript - 尝试在 Fancybox 回调中调用 CoffeeScript 方法时出现范围问题

c++ - 声明时还有另一个 'not declared in this scope' 问题

android - 通过模块与注入(inject)构造函数进行 Dagger 2 配置

android - DialogFlow Android SDK需要grpc-okhttp,但添加它会导致Socket IO CLient崩溃

android - 如何同时使用抽屉导航和底部导航 - 导航架构组件

android - Ktlint 与 lint 的区别?

reference - Xtext 交叉引用和范围界定

Swift 范围问题