我是Kotlin的新手并且正在完成可用的教程。 但是现在我似乎遇到了辅助构造函数的问题: 可以在函数中访问在主构造函数中声明的参数, 但是当我尝试使用辅助构造函数中的参数执行此操作时,我收到错误:未解析的引用:nbr
代码:
class Test(_name: String) {
val name: String = _name
constructor(_name: String, _nbr: Int) : this(_name) {
val nbr: Int = _nbr
}
fun printNameAndNumber() {
println("Name: $name")
println("Number: $nbr")
}
}
我很清楚我做的事情基本上是错的,但是谁可以告诉我什么?
答案 0 :(得分:4)
nbr
应该是一个变量,因为在这种特定情况下它是可选的:
class Test(_name: String) {
val name: String = _name
var nbr: Int? = null
constructor(_name: String, _nbr: Int) : this(_name) {
this.nbr = _nbr
}
fun printNameAndNumber() {
println("Name: $name")
println("Number: $nbr")
}
}
答案 1 :(得分:2)
主要构造函数的参数在成员函数中不可用。领域是。幸运的是,Kotlin有一个简短的语法来立即生成主构造函数参数成员属性。
使用主构造函数构造时,您期望nbr
是什么?我建议你交换你的构造函数,所以很明显什么是属性,什么是参数:
class Test(val name: String, val nbr: Int) {
constructor(name: String) : this(name, 0)
fun printNameAndNumber() {
println("Name: $name")
println("Number: $nbr")
}
}
fun main(args : Array<String>) {
Test("Péter").printNameAndNumber()
}
答案 2 :(得分:1)
name
是可访问的,因为它是成员。
nbr
无法访问,因为它是辅助构造函数中的本地(不可变)变量。
如果您将nbr
声明为成员:例如将val nbr: Int
放在val name
行下方,则可以访问它,但如果将nbr
定义为val
,则无法编译不可变的(class Test(_name: String, _nbr: Int = 0) {
val name: String = _name
val nbr: Int = _nbr
fun printNameAndNumber() {
println("Name: $name")
println("Number: $nbr")
}
}
)。
更简单的结构是:
class Test(val name: String, val nbr: Int = 0) {
fun printNameAndNumber() {
println("Name: $name")
println("Number: $nbr")
}
}
甚至更简单
nbr
如果您希望{{1}}成员可以为空,可以使用@ gil.fernandes的建议。