2017-12-01 2 views
1

私はkotlinを学んでいて、最近興味深いkotlinの書き方を見つけましたが、本当に理解できません。コンパイルオブジェクトブロック内の楽しみとkotlin内のクラス外の違い?

は、クラスの外でdrawerImageLoaderを定義しなければならない理由here

fun drawerImageLoader(actions: DrawerImageLoaderKt.() -> Unit): DrawerImageLoader.IDrawerImageLoader { 
    val loaderImpl = DrawerImageLoaderKt().apply(actions).build() 
    DrawerImageLoader.init(loaderImpl) 
    return loaderImpl 
} 

class DrawerImageLoaderKt { 
    ... 
} 

から私が学んでいるコードを撮影しましたか?なぜクラスでは、companion objectブロック内にすることはできません?

また、.()は、DrawerImageLoaderKt.()の意味は何ですか?

答えて

4

この関数は、DrawerImageLoader.IDrawerImageLoaderオブジェクトに何らかの種類のファクトリを提供するためにクラス外で定義されているため、具体的なインスタンスにはバインドされていません。その体内の関数リテラルのせず

構文DrawerImageLoaderKt.()私はこのスレッドで説明Lambda with Receiverを定義:レシーバとHow to create nested function callbacks like anko - DSL syntax Kotlin

ラムダ(DrawerImageLoaderKtここ)受信機でメソッドをコールすることを可能に任意の特定の修飾子(それはdrawerImageLoaderの呼び出し元が行うものです)。これは拡張機能と非常によく似ており、拡張機能内の受信側オブジェクトのメンバーにアクセスすることも可能です。

+0

このような明確な説明をありがとうございました – user1865027

4

ちょっとああ、これは私のライブラリです:)

それを接頭辞なしで起動することができるようにdrawerImageLoader機能がパッケージレベルの関数として定義される(それがインスタンスだったかどうかを行う必要があるだろうとして、 object方法)。それは定期的またはコンパニオンオブジェクトにあった場合、それは代わりに次のようになり

override fun onCreate() { 
    super.onCreate() 

    drawerImageLoader { 
     set { 
      ... 
     } 
     cancel { 
      ... 
     } 
    } 
} 

、私はあまり素敵なDSLになり信じている:これは、あなたがそれを呼び出すとき(コードhereを参照してください)あなたは、次の構文を提供します:

そのパラメータの種類については
override fun onCreate() { 
    super.onCreate() 

    SomeClass.drawerImageLoader { 
     set { 
      ... 
     } 
     cancel { 
      ... 
     } 
    } 
} 

、s1m0nw1 @すでに大部分がその部分hereに答えが、私はもう少しを追加します。

これは、drawerImageLoader関数に渡しているラムダ内のDrawerBuilderKtの範囲にあなたを配置する受信機を持つラムダです。このクラスはset,cancelplaceholderのメソッドを持っているので、ラムダの内部で利用できるようになります。

+0

うわー!素晴らしいライブ!私はkotlinを学ぶ基礎のチュートリアルを終えました。あなたのレポを読んで、kotlinの書き方をもっと理解しています。 – user1865027

関連する問題