如何在Kotlin中访问构造函数块外的辅助构造函数参数

时间:2018-04-18 11:32:21

标签: constructor kotlin

我是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")
}

}

我很清楚我做的事情基本上是错的,但是谁可以告诉我什么?

3 个答案:

答案 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的建议。