7

これらの演算子 (<:<、<%<、=:=) がここで何をするかを尋ねる関連する質問があることがわかりました。

<:<、<%<、および =:= は Scala 2.8 で何を意味し、どこに文書化されていますか?

しかし、私はまだそれらの実装について混乱しています。特に、特定の関係をアサートする暗黙のパラメーターを配置すると、自動的に適切にキャストされたかのように変数を使用できると思います。たとえば、次のようにコンパイルされます。

class Foo[T](a: T) {
  def splitit(implicit ev: T <:< String) = a split " "
}

しかし、これはコンパイラで実際にどのように機能するのでしょうか? これらの演算子に対する魔法のようなコンパイラのサポートはありますか? そうでない場合、定義からこの種の関係を推測できるようにする基本的なメカニズムは何ですか? (このメカニズムは、これらの演算子が動作できるようにするために特別に追加されたものですか? また、これらの特定の演算子にどの程度固有のものですか?) コンパイラによる型の解釈を何らかの方法で変更する、このような追加の暗黙のパラメーターを配置できることは、少し魔法のように思えます。

4

1 に答える 1

8

実装は少しトリッキーですが、魔法のようなものは何もありません。

任意Predefのタイプの値を提供できる暗黙のメソッドがありますA <:< AA

implicit def conforms[A]: A <:< A

メソッドを呼び出そうとすると、タイプの暗黙の値が検索されますT <:< Stringconforms[T]コンパイラは、が有効な値であるかどうかを確認します。たとえば、スコープに暗黙の値がありT、メソッド呼び出しをコンパイルできるようになるとします。方法が定義されているためNothingNothing <:< Nothing<:<

sealed abstract class <:<[-From, +To]

From上に変化することToが許可され、下に変化することが許可されます。したがって、はのサブタイプであるため、aNothing <:< Nothingは引き続き有効です。はのスーパータイプであるため、 Aも有効です(ただし、コンパイラは常に最初のタイプのみを選択するようです)。Nothing <:< StringNothingStringString <:< StringNothing <:< StringStringNothing

また、別名を拡張し、からへの暗黙の変換として機能Stringするため、そのメソッドを呼び出すことができます。これにより、基本的に安全なキャストが実行されます。<:<=>Function1TString

=:=分散アノテーションなしで定義されていることを除いて同じです。したがって、タイプは完全に一致する必要があります。

<%<は次のように定義され<:<ますが、暗黙的なメソッドは少し異なり、ビュー境界を指定するための別のパラメータを追加します

implicit def conformsOrViewsAs[A <% B, B]: A <%< B

また、非推奨になりました。

于 2012-07-15T05:57:49.230 に答える