Чтобы уточнить: вам не нужно it
для infix
для работы.Вместо этого вы могли бы просто написать this
, например, this compileSdkVersion 26
.
. Обратите внимание также, что достаточно просто иметь следующее:
fun android(block: Android.() -> Unit) = Android().apply(block)
class Android(var compileSdkVersion: Int = 0,
var buildToolsVersion: String = "")
Использование тогда только отличаетсяна =
к тому, что вы показали:
val androidConfig = android {
buildToolsVersion = "28.0.3"
compileSdkVersion = 26
}
Но выгода намного больше: гораздо меньше кода для поддержки; -)
Что касается другого пункта, который вы упомянули, что вынеобходимо предоставить функции расширения.Вам не нужно.Достаточно просто поместить infix fun Android.buildToolsVersion
внутри class Android
без Android.
, и это сработало бы, например:
class Android(var compileSdkVersion: Int = 0,
var buildToolsVersion: String = "") {
infix fun buildToolsVersion(buildToolsVersion: String) {
this.buildToolsVersion = buildToolsVersion
}
Теперь относительно consolePrint
.Это выглядит также довольно сложно для меня.А как насчет следующего вместо этого внутри class Android
?
fun toConsolePrint() = "compileSDK: $compileSdkVersion build tools: $buildToolsVersion"
Вот для чего на самом деле используются функции ... конечно: если вам не нравятся скобки, вы все равно можете использовать свой подход с get()
, но звучит как функция, действует как функция, поэтому, вероятно, также является функцией; -)
Полный образец с добавлением только разницы ()
и =
:
fun main() {
val androidConfig = android {
buildToolsVersion = "28.0.3"
compileSdkVersion = 26
}
println(androidConfig.toConsolePrint())
}
fun android(block: Android.() -> Unit) = Android().apply(block)
class Android(var compileSdkVersion: Int = 0,
var buildToolsVersion: String = "") {
fun toConsolePrint() = "compileSDK: $compileSdkVersion build tools: $buildToolsVersion"
}