如何在Kotlin中匿名传递委派财产?

时间:2019-01-08 19:10:11

标签: kotlin delegates parameter-passing lazy-evaluation delegated-properties

让我们假设一个简单的类:

class Foo(val p:String)

我想通过传递惰性委托来创建类的实例:

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

但是我不需要样板lazyP变量。如何写单线?像这样:

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

1 个答案:

答案 0 :(得分: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" })