14

self 型は次の例のようになります。

trait A { self: String => }

これは、その特性A(またはそのサブタイプ) が class を継承する必要があることを示していStringます。

キーワードの後に​​変数 inselfが続き、タイプは の後に続きます。:var s: String:

しかし=>、自己型の状態は何ですか? この背後にある理由は何ですか?

4

3 に答える 3

11

仕事を推測するだけです...自己型宣言の特定の区切り文字が必要です。=>が省略されたと想像してください。this: String構文的に有効なステートメントになります (ただし、型チェッカーは文句を言います)。

では、どれを区切り文字にする必要がありますか? のようなネストされた中括弧は必要ありませんtrait A { self: String { ... }}。では、ペアになっていない既存の区切り文字はどれですか? =>私が考えることができる唯一のものです。

他のどこで=>使用されていますか? A => B関数型 ( ) および関数本体 ( )のシュガーとしてi: Int => i + 1。また、名前による呼び出しの引数、およびパターン マッチの場合も同様です。この最後の使用法は、自己型とある程度一貫しています。これは、特定のタイプになるように一致thisし、この「一致」に応じて本体を定義するようなものです。わかりませんが、これはばかげた類推かもしれません。

于 2012-06-30T22:10:22.813 に答える
10

selfこれはキーワードではなく、通常の識別子であることに注意してください。の代わりに他の有効な識別子を実際に書くことができますself。そして:、式が型の帰属になった後は、式が有効な場所であればどこでも完全に有効なものになります。

これ=>は、自己型があることを Scala に伝えるものです。それ以外の場合はself: Type、単純なステートメント、式のように見えます。例えば:

class A
class B extends A {
  this: A
}

これは有効な Scala コードであり、self 型はありません。

于 2012-07-01T03:44:39.873 に答える
0

thisクラスの本体内のスコープ内にあるため、その意味ではパラメーターです (ただし、そのように考えることはありません)。自己型構文は単純にそれを明示的にし、別の名前 (および型) を与えることを可能にします。したがって、矢印は、バインダーとそのスコープの間の区切りとして非常に適しています。

于 2012-07-01T21:52:17.963 に答える