self 型は次の例のようになります。
trait A { self: String => }
これは、その特性A
(またはそのサブタイプ) が class を継承する必要があることを示していString
ます。
キーワードの後に変数 inself
が続き、タイプは の後に続きます。:
var s: String
:
しかし=>
、自己型の状態は何ですか? この背後にある理由は何ですか?
仕事を推測するだけです...自己型宣言の特定の区切り文字が必要です。=>
が省略されたと想像してください。this: String
構文的に有効なステートメントになります (ただし、型チェッカーは文句を言います)。
では、どれを区切り文字にする必要がありますか? のようなネストされた中括弧は必要ありませんtrait A { self: String { ... }}
。では、ペアになっていない既存の区切り文字はどれですか? =>
私が考えることができる唯一のものです。
他のどこで=>
使用されていますか? A => B
関数型 ( ) および関数本体 ( )のシュガーとしてi: Int => i + 1
。また、名前による呼び出しの引数、およびパターン マッチの場合も同様です。この最後の使用法は、自己型とある程度一貫しています。これは、特定のタイプになるように一致this
し、この「一致」に応じて本体を定義するようなものです。わかりませんが、これはばかげた類推かもしれません。
self
これはキーワードではなく、通常の識別子であることに注意してください。の代わりに他の有効な識別子を実際に書くことができますself
。そして:
、式が型の帰属になった後は、式が有効な場所であればどこでも完全に有効なものになります。
これ=>
は、自己型があることを Scala に伝えるものです。それ以外の場合はself: Type
、単純なステートメント、式のように見えます。例えば:
class A
class B extends A {
this: A
}
これは有効な Scala コードであり、self 型はありません。
this
クラスの本体内のスコープ内にあるため、その意味ではパラメーターです (ただし、そのように考えることはありません)。自己型構文は単純にそれを明示的にし、別の名前 (および型) を与えることを可能にします。したがって、矢印は、バインダーとそのスコープの間の区切りとして非常に適しています。