関数にClassName.()で指定された引数がある例を見たことがありますが、これはClassName.Function()である拡張関数ではないようです。
例えばコッターナイフ:
private val View.viewFinder: View.(Int) -> View?
get() = { findViewById(it) }
その機能についてはよく分かりませんが、
そしてマテリアル引き出しKt
fun Activity.drawer(setup: DrawerBuilderKt.() -> Unit = {}): Drawer {
val builder = DrawerBuilderKt(this)
builder.setup()
return builder.build()
}
コードで直接呼び出すことができる場合
drawer {
...
}
括弧で囲まれた引数を与えるのではなく、
これに関する文書はどこかにありますか?
ベストアンサー1
Kotlin で何も受け取らず何も返さない関数は次のようになります。
var function : () -> Unit
違いは、コード内の関数が何も受け取らず、何も返さないことです。しかし、オブジェクトに対して呼び出される。
例えば、
class Builder (val multiplier: Int) {
fun invokeStuff(action: (Builder.() -> Unit)) {
this.action()
}
fun multiply(value: Int) : Int {
return value * multiplier
}
}
ここで重要なのは、action
action: (Builder.() -> Unit)
これは何も返さず、何も取り込まない関数です型のオブジェクトに対して呼び出されますBuilder
。
つまり、このビルダーを次のように使うと
var builder = Builder(10)
builder.invokeStuff({
var result = multiply(1)
println(result)
})
のコンテキストはthis
ビルダー オブジェクトに設定されており、ビルダー内で宣言された関数を呼び出すことができます。