Как передать делегированную собственность анонимно в Котлин?
Давайте предположим простой класс:
class Foo(val p:String)
Я хотел бы создать экземпляр класса, передав ленивый делегат:
val lazyP by lazy {"foo"}
println(Foo(lazyP).p)
но мне не нужен шаблон lazyP
переменная. Как написать однострочник? Что-то вроде:
println(Foo(by lazy {"foo"}).p)
1 ответ
Я предполагаю, что вы пытаетесь построить 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" })