我是Kotlin的新手,所以需要帮助来了解代码,我去了一个博客,发现了类似的东西,并在我的代码中实现了,代码工作正常,但我无法理解以下内容。
基本上,我对 lazyDefferd 函数的工作方式以及内部工作原理一无所知。
一种。通用T的传递方式。
b。 CoroutineScope.()
的含义是什么,因为我知道这是我需要从ViewModel
传递过来的输入,但是我不明白它是如何传递的。
interface MovieRepository {
suspend fun getTopRatedMovie(page:Int): LiveData<out List<TopRatedMovieEntity>>
}
ViewModel:
class TopRatedMovieViewModel(movieRepository: MovieRepository):ViewModel() {
val topMovie by lazyDefferd{
movieRepository.getTopRatedMovie(1)
}
}
fun <T> lazyDefferd(block:suspend CoroutineScope.()->T):Lazy<Deferred<T>>{
return lazy {
GlobalScope.async(start = CoroutineStart.LAZY) {
block.invoke(this)
}
}
}
答案 0 :(得分:1)
a。通用T的传递方式。
您可以明确地传递它,例如:
val myLazyDeffered = lazyDefferd<SomeType> {
// …
}
但是编译器通常可以推断出类型,因此更通常地忽略它(除非出于某种原因,从代码中看不出来)。这就是您的topMovie
示例中发生的事情:编译器知道lambda返回的类型,因此可以从中推断出T
。
(您可能已经注意到,lazyDefferd()
也带有一个值参数,但是由于它是最后一个参数和lambda,因此Kotlin可以省略括号)。
b。
是什么意思CoroutineScope.()
那是function literal with receiver。传递给block
的lambda的行为就好像是CoroutineScope
类的扩展方法:在lambda中,this
将引用一个CoroutineScope
实例。类似于将实例作为参数传递给lambda(在这种情况下,就是这样),但是语法更加简洁。