Как передать делегированную собственность анонимно в Котлин? - PullRequest
0 голосов
/ 08 января 2019

Давайте предположим простой класс:

class Foo(val p:String)

Я хотел бы создать экземпляр класса, передав ленивый делегат :

val lazyP by lazy {"foo"}
println(Foo(lazyP).p)

но мне не нужна переменная шаблон lazyP. Как написать однострочник? Что-то вроде:

println(Foo(by lazy {"foo"}).p)

1 Ответ

0 голосов
/ 09 января 2019

Я предполагаю, что вы пытаетесь создать Foo и рассчитать p только при первом вызове? Если это так, я не думаю, что определение Foo, как вы это сделали, будет работать, потому что когда вы создаете Foo, вызывается ленивый делегат. Это потому, что для построения Foo нужна строка, поэтому в этот момент вычисляется ленивый делегат. Другими словами, это:

val lazyP by lazy { "foo" }
val foo = Foo(lazyP)

более или менее эквивалентно:

val foo = Foo("foo")

Я думаю, что если вы хотите, чтобы Foo имел ленивое делегированное свойство, вы должны определить его следующим образом:

class Foo(lazyP: Lazy<String>) {
    val p by lazyP
}

Затем вы можете создать его в виде одной строки без отдельной переменной:

val foo = Foo(lazy { "foo" })
...