首页 > 解决方案 > 如何在 Kotlin 中匿名传递委托属性?

问题描述

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

class Foo(val p:String)

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

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

但我不需要样板lazyP变量。如何写一个单行字?就像是:

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

标签: kotlindelegatesparameter-passinglazy-evaluationdelegated-properties

解决方案


我想您要做的是构造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" })

推荐阅读