T.() -> Unit
は受信機付きの拡張機能タイプです。
通常の機能に加えて、Kotlinは拡張機能をサポートしています。このような機能は、受信機タイプ指定を有する点で通常の機能とは異なる。ここには一般的なT.
の部分があります。
拡張機能の内部this
キーワードはレシーバ・オブジェクト(ドットの前に渡される1)に該当するので、あなたが直接そのメソッドを呼び出すことができます(親スコープからthis
を参照するには、まだwith qualifiers可能です)。
機能with
が標準です。 、だから、タイプT
と第二の第一引数「受信機」で、T
とR
のための一般的な機能です
/**
* 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
を拡張し、拡張機能の種類、返すタイプR
のf
:それは現在のコードです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({}
)を使用することができますが、それは受信機の種類を推測することができた場合にのみ機能します文脈から
偉大な答えをありがとう、私はそれらを理解するためにそれぞれのfx自分自身に言わなければならなかった。 Class1。() - > Class2'と '(Class1) - > Class2'の違いは何ですか? – ssuukk
OK、私は知っています - ' Class1。() - > (Class1) - > Class2はラムダを受け取り、それを持っています – ssuukk
@ssuukkはい、あなたは正しい - 'Class1。() - > Class2'は' this'を持っています'(Class1) - > Class2'は' it'を持っています。どちらも交換可能な機能です。 –