а. Как передается общий T.
Вы можете передать его явно, например ::10000
val myLazyDeffered = lazyDefferd<SomeType> {
// …
}
Но компилятор обычно может вывести тип, поэтому его обычно опускают (если нет причины, по которой это неясно из кода). Вот что происходит в вашем topMovie
примере: компилятор знает, какой тип возвращает лямбда, поэтому он выводит T
из этого.
(Как вы, наверное, уже заметили, lazyDefferd()
также принимает параметр-значение, но, поскольку он является последним параметром и лямбда-выражением, Kotlin позволяет вам опускать парены.)
б. Что это значит под этим CoroutineScope.()
Это функциональный литерал с получателем . Лямбда, которую вы передаете block
, будет вести себя так, как будто это метод расширения класса CoroutineScope
: внутри лямбды this
будет ссылаться на экземпляр CoroutineScope
. Это похоже на передачу экземпляра в качестве параметра лямбда-выражения (и в данном случае так оно и называется), но синтаксис более лаконичен.