Как передать данные из класса данных в функцию

#function #class #kotlin

#функция #класс #kotlin

Вопрос:

Мне нужно использовать функцию для печати данных из класса данных и, прочитав некоторые другие ответы на этом сайте, но я все еще не понимаю, как это сделать. Помощь была бы оценена!

 data class Chemical(
    val key: String,
    val name : String,
    val formula : String
)

fun printans(Chemical(q):: data class) {

    println("Key = $q.key,  Name = $q.name Formula = $q.formula")

}

fun main(args: Array<String>) {

    val cuso4 = Chemical("001", "Copper(II) sulphate", "CuSO4")
    val cacl2 = Chemical("002", "Calcium chloride", "CaCl2")

    printans(cuso4)
    printans(cacl2)
}
  

У меня есть десятки сообщений об ошибках, например:

 test.kt:9:22: error: expecting comma or ')'
fun printans(Chemical(q):: data class) {

test.kt:11:2: error: expecting member declaration
    println("Key = $q.key,  Name = $q.name Formula = $q.formula")

etc
  

Комментарии:

1. Chemical(q):: data class недопустимый синтаксис

2. Чтение документов всегда является хорошей практикой, прежде чем задавать вопросы.

Ответ №1:

Ваш синтаксис неправильный, и поскольку Chemical это класс данных, вам даже не нужно создавать строку самостоятельно, она уже будет создана для вас:

 fun printans(c: Chemical) {
    println(it)
}
  

Химический (ключ =foo, имя=bar, формула=baz)

Итак, вы могли бы даже упростить до println(c) и не использовать выделенную функцию, поскольку она не делает ничего большего, чем println могла бы сделать.

Если этот формат вам не подходит, я бы рекомендовал переопределить toString of Chemical .

 data class Chemical(/* ... */) {
    fun toString(c: Chemical) = "Key = ${c.key},  Name = ${c.name} Formula = ${c.formula}"
}
  

Таким образом, независимо от того, куда вы их передаете println , выходные данные всегда будут в желаемом формате, потому что println вызовы toString находятся под капотом.

Комментарии:

1. Большое спасибо за ваш быстрый и полезный ответ! Я думал, что перепробовал все возможные комбинации синтаксиса, но пропустил эту. Еще раз спасибо!

Ответ №2:

Добавьте фигурные скобки и используйте q: Chemical вместо Chemical(q):: data class .

 fun printans(q: Chemical) {
    println("Key = ${q.key},  Name = ${q.name} Formula = ${q.formula}")
}

  

Комментарии:

1. И исправление объявления функции на fun printans(q: Chemical) { .

Ответ №3:

Вы можете использовать расширенную функцию Kotlin! Вот так:

 fun Chemical.printans(){
println("Key = ${this.key},  Name = ${this.name} Formula = ${this.formula}")
}
  

И просто вызвать его:

 val chemical = Chemical("Key", "Name", "Formula")
chemical.printans()
  

Вы можете прочитать больше о расширенных функциях здесь

Комментарии:

1. printans и prinntln кажутся несоответствующими.