web-dev-qa-db-ja.com

Kotlinで「。()」とはどういう意味ですか?

関数にClassName。()で指定された引数がある例を見てきました。これは、ClassName.Function()である拡張関数ではないようです。

例は Kotterknife :です。

private val View.viewFinder: View.(Int) -> View?
    get() = { findViewById(it) }

の機能はよくわかりませんが、

および MaterialDrawerKt

fun Activity.drawer(setup: DrawerBuilderKt.() -> Unit = {}): Drawer {
    val builder = DrawerBuilderKt(this)
    builder.setup()
    return builder.build()
}

コードで直接呼び出すことができる場所

drawer {
    ...
}

括弧で囲まれた引数を与えるのではなく。

これに関するドキュメントはどこかにありますか?

17
Allan W

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: (Builder.() -> Unit)

これは、何も返さず、何も受け取らない関数であり、「Builder」タイプのオブジェクトで呼び出されます。

詳細はこちら

11
Kris Roofe

@KrisRoofeの回答は物事を明確にします。さらに追加させてください。

fun Activity.drawerは、drawerクラスで拡張関数名Activityを作成していることを意味します。これが、ActivityクラスまたはActivityクラスの子から直接drawerメソッドを呼び出すことができる理由です。

拡張関数の詳細 ここ

(setup:DrawerBuilderKt。()-> Unit = {})このステートメントでは、kotlinの高階関数の能力を確認できます。高階関数の小さな紹介:-It is a function that takes functions as parameters, or returns a function.したがって、ここでsetupparamは、NothingまたはUnitを返す関数です。 (JavaではVoid)と同じです。DrawerBuilderKt。()は、DrawerBuilderKtのオブジェクトを使用して関数を呼び出すことができることを意味します。クラス。= {}は、setupパラメータがオプションであることを意味します。関数はパラメータを受け取らず、何も返しません。

高階関数の詳細 ここ および ここ 。オプションパラメータの詳細 ここ

private val View.viewFinder:View。(Int)-> View?関数をプロパティに格納します。 ここ 同じことについてのより多くの情報。その他は上記と同じです。

これがお役に立てば幸いです。

4

これは良い質問です。したがって、この種のステートメントがある場合:T.()

これは、渡すラムダで、「this」(現在のオブジェクト)がタイプTになることを意味します。理解しやすいことを見てみましょう。

次のように定義されたラムダを取り込むmyFunという関数を持つクラスがあるとしましょう。

 class MyObject {
        fun myFun(doSomething: MyObject.()->Unit) {
            doSomething()
        }

        fun doAnotherThing() {
            Timber.d("myapp", "doing another thing")
        }
    }

この関数を呼び出すには、次のようにします。

MyObject().myFun { doAnotherThing() }

myObject()参照を「this」として使用することがどのようにわかったかを確認してください。これは実際にはthis.doAnotherThing()を呼び出しています。ここで、これは作成されたばかりのMyobject()インスタンスです。

これもできたはずです:

MyObject().apply{myFun { doAnotherThing() }}  
3
j2emanue