Как я могу приблизиться к объектному выражению, возвращенному в Kotlin - PullRequest
0 голосов
/ 02 февраля 2020
fun personInfo(_name: String, _age: Int):Any {

    val person = object {
        val name = _name
        val age = _age
    }
    return person
}
fun main() {

   val result = personInfo("sam", 36)
    println(result.name) //error
    println(result.age) //error

}

почему я не могу использовать "println (result.name)" и "println (result.age)" ???

1 Ответ

1 голос
/ 02 февраля 2020

почему я не могу использовать "println(result.name)" и "println(result.age)" ???

Поскольку вы объявили тип возврата fun personInfo равным Any. Выражение object не имеет именованного типа, поэтому вы не можете ссылаться на него, если не ссылаетесь непосредственно на результат выражения, что вы можете сделать, только если это переменная верхнего уровня.

Kotlin не имеет структурных типов, вместо этого вы должны объявить именованный интерфейс со следующими свойствами:

interface PersonInfo {
    val name: String
    val age: Int
}

fun personInfo(_name: String, _age: Int) = object : PersonInfo {
    override val name = _name
    override val age = _age
}

Однако я бы посчитал это очень неловкой идиомой в Kotlin, класс данных был бы очень более естественный:

data class PersonInfo(
    val name: String,
    val age: Int
)

fun personInfo(_name: String, _age: Int) = PersonInfo(_name, _age)

Вы также можете бросить fun personInfo и использовать конструктор напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...