Kotlin Функция высшего порядка в ViewModel - PullRequest
2 голосов
/ 18 июня 2019

Я новичок в kotlin, поэтому мне нужна помощь, чтобы понять код, я пошел в блоги и нашел что-то подобное и реализовал в своем коде, код работает отлично, но я не могу понять следующие вещи.

По сути, я заблудился в том, как lazyDefferd работает, как это работает внутри.
a.Как передается общий 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)
        }
    }
}

1 Ответ

1 голос
/ 18 июня 2019

а. Как передается общий T.

Вы можете передать его явно, например ::10000

val myLazyDeffered = lazyDefferd<SomeType> {
    // …
}

Но компилятор обычно может вывести тип, поэтому его обычно опускают (если нет причины, по которой это неясно из кода). Вот что происходит в вашем topMovie примере: компилятор знает, какой тип возвращает лямбда, поэтому он выводит T из этого.

(Как вы, наверное, уже заметили, lazyDefferd() также принимает параметр-значение, но, поскольку он является последним параметром и лямбда-выражением, Kotlin позволяет вам опускать парены.)

б. Что это значит под этим CoroutineScope.()

Это функциональный литерал с получателем . Лямбда, которую вы передаете block, будет вести себя так, как будто это метод расширения класса CoroutineScope: внутри лямбды this будет ссылаться на экземпляр CoroutineScope. Это похоже на передачу экземпляра в качестве параметра лямбда-выражения (и в данном случае так оно и называется), но синтаксис более лаконичен.

...