kotlin getter 和 setter 期望成员声明错误?
Posted
技术标签:
【中文标题】kotlin getter 和 setter 期望成员声明错误?【英文标题】:kotlin getters and setters expecting member declaration error? 【发布时间】: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
进行编译。
【问题讨论】:
【参考方案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,我认为使用分号应该让事情更熟悉,并且不需要使用换行符来格式化代码。无论如何,对于未来,这是您能想到的关于此类分号错误的唯一陷阱还是还有更多? @Khaled Perhaps see this question?以上是关于kotlin getter 和 setter 期望成员声明错误?的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin类的初始化 ① ( 成员属性 | Kotlin 自动为成员字段生成 getter 和 setter 方法 | 手动设置成员的 getter 和 setter 方法 | 计算属性 )