这条代码行在做什么?
fun<T:x>a.b(y: Int)=lazy{u.v<T>(y)}
我不知道什么是“懒惰”做的,或者是“懒惰”的东西,在科特林。
发布于 2020-06-21 15:12:14
funa.b(y: Int)=惰性{U.V(Y)}
让我们把这个拆开。首先,让我们为可读性重新格式化:)
fun <T: x> a.b(y: Int) = lazy { u.v<T>(y) }
现在,让我们一片片地去。
fun
意味着我们要声明一个新方法。
<T:x>
意味着这是一个在T
类型上操作的泛型方法,其中T
是受约束,属于x
类型。
a.b
意味着这是一个名为b
的a
类型。
(y: Int)
意味着定义的函数b
接受一个名为Int
类型的y
的参数。
=
是表达式体语法 --用于返回短代码行的缩写。这意味着a.b
将返回计算lazy { }
的结果的值。
lazy
是Kotlin标准库函数,它将提供给它的函数的评估延迟到需要时,然后缓存结果。此函数的返回值实际上是包装所提供函数的类型Lazy
。
{ u.v<T>(y) }
是Lazy
对象第一次获得值时将执行的函数,u.v<T>(y)
的返回值将保存为惰性对象的value
。
呼!那这是什么意思?让我们看一个例子。假设我们向函数中添加了一个print语句,以查看何时调用它。
fun <T: x> a.b(y: Int) = lazy {
println("Executing 'b'")
u.v<T>(y)
}
现在,如果你试图使用它:
fun main() {
val a = A<T>() // Assume some type T
val lazyObject = a.b<T>(42) // Call the extension method that returns a `Lazy`
// Get the value from the lazy object - prints "Executing 'b'",
// executes `u.v<T>(y)`, caches the result, returns it - then print it
println(lazyObject.value)
// Get the value from the lazy object again. This time, DOES NOT print
// "Executing 'b'", DOES NOT execute `u.v<T>(y)`, and just returns the
// result that was already computed and cached, then print it
println(lazyObject.value)
}
因此,总之,您发布的代码正在创建一个扩展方法,该方法返回一个Lazy
对象,当查询其值时,该对象执行它被初始化的lambda并缓存以供以后使用。
希望这能帮上忙!
https://stackoverflow.com/questions/62504655
复制相似问题