2017-06-27 19 views
4

私はこのtutorialを読んでいると、暗黙的な変換定義をコンパイルするとき、コンパイラは警告して無差別に使用されている場合、暗黙的な変換が落とし穴を持つことができるため下部にはなぜimplicit defにはimplicitConversionsのインポートが必要ですが、implicit valではインポートが必要ですか?

を述べています。警告は、これらのアクションのいずれかを取るオフにするには:あなたがではなく、暗黙的なヴァルを使用している場合、暗黙的な変換定義のスコープにインポートscala.language.implicitConversionsを...

警告がスローされません。暗黙のdef。何故ですか?

つまり

、私は次の操作を実行した場合、私は輸入を必要としない:

implicit val int2str = (i: Int) => i.toString 

しかし、私は次のことを行うならば、私は、インポートが必要です。

implicit def int2str(i: Int) = i.toString 

- ----更新-----ここ は暗黙のvalが機能することを示している、おもちゃの例です:

おそらく
case class CoolString(coolString: String) 

class RichCoolString(rich: CoolString) { 
    val hasCat: Boolean = rich.coolString.contains("cat") 
} 

object RichCoolString { 
    implicit val coolStringToRichCoolString = (coolString: CoolString) => new 
RichCoolString(coolString) 
} 

scala> import RichCoolString._ 
import RichCoolString._ 

scala> CoolString("cool cats").hasCat 
res0: Boolean = true 
+0

暗黙の変換は、暗黙のうちに「自動的に」自動的に適用されます。誤解を招く可能性があります。 Typeclassは暗黙的に0..n型に基づいています。 – cchantep

答えて

3

これはバグであり、両方のケースについて警告があるはずです。少なくとも私は仕様で例外を見つけることができませんでした。作成されたhttps://github.com/scala/bug/issues/10392

+1

うん、ここでも定義されているので、valも警告を出すはずです:http://docs.scala-lang.org/sips/completed/modularizing-language-features.html(ページ4 implicitConversion) – thwiegan

+0

ありがとう多く!私はそれが私にインポートを救ったので、valのアプローチを使用することを選んでいたが、今、それはバグであることを知って、私はdefsを使用することに戻ります。 – user451151

関連する問題