2015-10-17 23 views
13

これは標準Kotlinの関数は(私が知る限り)T()のKotlin関数シグネチャは何を意味しますか?

inline fun<T> with(t: T, body: T.() -> Unit) { t.body() } 

しかし、誰もが簡単な英語で書くことができ、正確に署名が何を意味するのですか? Tの汎用関数で、最初の引数 "t"が のT型で、2番目の "body"が関数型の、関数?を受け入れます。そして、(単位)私はこの表記の何かを参照してください

何も返さない() - >何かがアンコのために、つまり、かなり頻繁に使用されます。

inline fun Activity.coordinatorLayout(init: CoordinatorLayout.() -> Unit) = ankoView({ CoordinatorLayout(it) },init) 

が、私はそれがどこでも何を説明したとは思いません(。 )を意味します...

答えて

15

T.() -> Unitは受信機付きの拡張機能タイプです。

通常の機能に加えて、Kotlinは拡張機能をサポートしています。このような機能は、受信機タイプ指定を有する点で通常の機能とは異なる。ここには一般的なT.の部分があります。

拡張機能の内部thisキーワードはレシーバ・オブジェクト(ドットの前に渡される1)に該当するので、あなたが直接そのメソッドを呼び出すことができます(親スコープからthisを参照するには、まだwith qualifiers可能です)。


機能withが標準です。 、だから、タイプTと第二の第一引数「受信機」で、TRのための一般的な機能です

/** 
* Calls the specified function [f] with the given [receiver] as its receiver and returns its result. 
*/ 
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f() 

順番に返さTを拡張し、拡張機能の種類、返すタイプRf:それは現在のコードですwith

たとえば、あなたはこのようにそれを使用することができます:

val threadInfoString = with (Thread.currentThread()) { 
    // isDaemon() & getPriority() are called with new property syntax for getters & setters 
    "${getName()}[isDaemon=$isDaemon,priority=$priority]" 
} 


は、ここでは、拡張機能のためのマニュアルを参照してください:
kotlinlang.org/docs/reference/lambdas.html#extension-function-expressions
kotlinlang.org/docs/reference/extensions.html


を追加しました:

したがって、唯一有効なfは、Tに定義された0引数の関数です。

実際はありません。 Kotlin function types and extension function types are unifiedでは、これらは互換的に使用できるようになっています。例えば、関数(String) -> Intが期待される場所でString :: lengthを渡すことができます。 Thread.() -> String & (Thread) -> Stringよう

// map() expects `(String) -> Int` 
// argument has type `String.() -> Int` 
strings.map(String::length) 

タイプは、バックグラウンド側から同じです - 受信機は、実際には、最初の引数です。

したがって、次のいずれかの機能がThread.() -> String引数に適している:

fun main(args: Array<String>) { 
    val f1 = fun Thread.(): String = name 
    val f2 = fun Thread.() = name 
    val f3: Thread.() -> String = { name } 
    val f4: (Thread) -> String = { it.name } 
    val f5 = { t: Thread -> t.name } 
    val f6: (Thread) -> String = Thread::getNameZ 
    val f7: Thread.() -> String = Thread::getNameZ 
    val f8 = Thread::getNameZ 
} 

fun Thread.getNameZ() = name 

それとも、単にthreadInfoStringでの例のようにfunction literal{})を使用することができますが、それは受信機の種類を推測することができた場合にのみ機能します文脈から

+0

偉大な答えをありがとう、私はそれらを理解するためにそれぞれのfx自分自身に言わなければならなかった。 Class1。() - > Class2'と '(Class1) - > Class2'の違いは何ですか? – ssuukk

+0

OK、私は知っています - ' Class1。() - > (Class1) - > Class2はラムダを受け取り、それを持っています – ssuukk

+0

@ssuukkはい、あなたは正しい - 'Class1。() - > Class2'は' this'を持っています'(Class1) - > Class2'は' it'を持っています。どちらも交換可能な機能です。 –

関連する問題