2012-07-15 6 views
7

(<:<、<% <は、=:=):<:<、<%<、=:=のScala実装はコンパイラでどのくらい正確に動作しますか?私は何をこれらの演算子尋ね関連する質問があることを今見

What do <:<, <%<, and =:= mean in Scala 2.8, and where are they documented?

しかし、私はまだ彼らの実装について困惑しているここで行います。具体的には、特定の関係を宣言する暗黙のパラメータを配置すると、自動的に適切にキャストされたかのように変数を使用できます。これはコンパイルされます:

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

これはコンパイラで実際にどのように機能しますか?これらの演算子のためのいくつかのマジックコンパイラのサポートはありますか?もしそうでなければ、この種の関係を定義から推論するための根底にあるメカニズムは何ですか? (この仕組みは、これらの演算子が動作するために特別に追加されたものであり、これらの特定の演算子にはどのように特別なものがありますか?)このような余分な暗黙的なパラメータを置くことで、コンパイラの型の解釈を何とか変更できます。

+2

ソースhttps://github.com/scala/scala/blob/v2.9.2/src/library/scala/Predef.scala#L394 – pedrofurla

答えて

8

実装は少しトリッキーですが、何も不思議な。

任意のA

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

用タイプA <:< Aの価値を提供することができますPredefにおける暗黙の方法は、あなたのメソッドを呼び出すようにしようとすると、それはタイプT <:< Stringの暗黙の値を探しますがあります。コンパイラは、conforms[T]が有効な値であるかどうかをチェックします。例えば、TNothingであるとすると、スコープ内に暗黙的な値Nothing <:< Nothingがあり、メソッド呼び出しをコンパイルできるようになります。道<:<

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

From

を定義している原因まで変化することが許されると Toはダウン変化することが許されます。だから、 Nothing <:< NothingNothingStringのサブタイプであるため、まだ有効 Nothing <:< Stringです。 StringNothingのスーパータイプがある(しかし、コンパイラは常にちょうど最初のタイプを選ぶように思われる)ので、 String <:< Stringも有効 Nothing <:< Stringだろう。

<:<=>Function1別名を拡張し、基本的に安全なキャストをやって終わるTからStringへの暗黙的な変換、として機能しますので、あなたはそれにStringのメソッドを呼び出すことができます。

=:=は、それがどの分散注釈なしで定義されている以外、同じことなので、種類が正確に一致する必要があります。

<%<<:<ように定義されているが、陰解法は少し異なっている、それはまた、廃止され

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

を結合したビューを指定するために別のパラメータを追加します。

+0

ありがとう! _ <:<も拡張=>別名Function1であり、TからStringへの暗黙的な変換として機能するため、Stringのメソッドを呼び出すことができます。これは、コンパイラがStringメソッド(またはその他)を呼び出す方法を説明するためのキーです。それは基本的に安全なキャストを終わらせます。 –

関連する問題