【问题标题】:kotlin getters and setters expecting member declaration error?kotlin getter 和 setter 期望成员声明错误?
【发布时间】:2021-05-15 09:19:34
【问题描述】:

我开始学习 kotlin,但在实现 getter 和 setter 时遇到问题,我在网上搜索过,而且我的 getter 和 setter 的代码与许多指南使用的代码相同。

package com.test
import kotlin.Int

class Test{

    var name: Int = 10;
    get(){
        println("getting value");
        return field;
    }
    set(value){
        println("setting value");
        field = value;   
    }
}

fun main() {
    val test = Test();
    println(test.name);
}

我看不出这段代码有什么问题导致 kotlin 编译器发出错误。我正在使用kotlinc proj.kt 进行编译。

【问题讨论】:

    标签: kotlin object getter-setter


    【解决方案1】:

    您似乎真的喜欢添加分号,并且您尝试将它们添加到任何地方。但是,在这种情况下,您添加的太早了:

    var name: Int = 10;
    get(){
        println("getting value");
        return field;
    }
    set(value){
        println("setting value");
        field = value;
    }
    

    整件事声明了一个名为name的属性,所以var name: Int = 10后面不应该有分号。

    您错误添加的分号使解析器认为name 的声明到此结束,因此解析器期望在此之后再进行另一个声明。你写了get() { ...,而不是另一个声明,这只有在你声明一个属性时才对解析器有意义,但就解析器而言,此时你没有声明一个属性,就像@987654329的声明一样@ 已经被你的分号结束了。

    如果必须添加分号,则应在set(value)} 之后,如下所示:

    var name: Int = 10
    get(){
        println("getting value");
        return field;
    }
    set(value){
        println("setting value");
        field = value;
    };
    

    有关属性声明,另请参阅grammar

    但是,请注意Kotlin coding convention says that you should omit semicolons whenever possible,因此您应该省略所有分号,如下所示:

    var name: Int = 10
    get(){
        println("getting value")
        return field
    }
    set(value){
        println("setting value")
        field = value
    }
    

    【讨论】:

    • 确实如此。 Kotlin 中很少需要分号;我想我只在将多个语句挤在一行上时使用过它们(这很少是一个好主意)。
    • @Sweeper 非常感谢,这让事情变得清晰了,现在我来自 C 和 python,我认为使用分号应该让事情更熟悉,并且不需要使用换行符来格式化代码。无论如何,对于未来,这是您能想到的关于此类分号错误的唯一陷阱还是还有更多?
    猜你喜欢
    • 2020-09-22
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2013-07-26
    • 2016-10-20
    相关资源
    最近更新 更多