Как расширить строковую интерполяцию Kotlin для работы с пользовательским классом? - PullRequest
0 голосов
/ 24 мая 2019

Из того, что я прочитал в документации, я понимаю, что интерполяция строк в Kotlin работает так, что этот код:

val n = 5 println("N is $n")

переводится как

StringBuilder().append("N is ").append(n).toString()

, что хорошо для типов, для которых Stringbuilder.append () имеет реализацию. Теперь я хочу использовать механику расширения Kotlin, чтобы добавить свой собственный класс:

class Foo(a: Int = 0, b: Float = 0f) {} fun Stringbuilder.append(aFoo: Foo) : Stringbuilder! { return this.append("A = $a, B = $b") }

чтобы при звонке:

aFoo = Foo(3,5.0f) println("aFoo parameters are: $aFoo")

выводит: «Параметры aFoo: A = 3, B = 5.0»

К сожалению, похоже, что мое расширение затенено:

public open fun append(obj: Any!): StringBuilder!

Мне не удалось найти в документации способ обойти это ... Предложения?

Спасибо!

1 Ответ

3 голосов
/ 24 мая 2019

Этого можно достичь, переопределив toString of Foo.

class Foo(val a: Int = 0, val b: Float = 0f) {

    override fun toString(): String {
        return "A = $a, B = $b"
    }

}
...