質問
transparent implicit
の変換は本当に良いアイデアであるかどうか、そして暗黙的にもっと暗黙的に使用するほうが良いのではないかと思っています。 。たとえば、パラメータとして Date
を受け入れるメソッドがあり、 String
を Date
に変換する暗黙的な変換があるとします。
implicit def str2date(s: String) : Date = new SimpleDateFormat("yyyyMMdd").parse(s)
private def foo(d: Date)
次に、透過的な implicit
変換でこれを呼び出すことができます:
foo("20090910")
文字列を日付に変換しているという事実をより明確にする方が良いでしょうか?
class DateString(val s: String) {
def toDate : Date = new SimpleDateFormat("yyyyMMdd").parse(s)
}
implicit def str2datestr(s: String) : DateString = new DateString(s)
したがって、使用法は次のようになります。
foo("20090910".toDate)
この利点は、後で何が起こっているかがより明確になることです-知っておく必要がある透過的な implicit
変換( Option
を Iterable
に変更しますか?)。この使用により、 implicit
のパワーを引き続き利用できます。
解決
「明示的」なほど、暗黙的な変換を行う方法は、少なくともこの例では、完全に透過的な変換よりも読みやすさの点ではるかに優れています。
私の意見では、 A
から B
に完全に透過的に implicit
sを使用しても、常に タイプ B
のオブジェクトが必要なときにいつでも使用できるように、タイプ A
のオブジェクトを表示します。たとえば、 String
から RandomAccessSeq [Char]
への暗黙的な変換は常に意味があります。 String
は、概念的には常に次のように表示できます。文字のシーケンス(Cでは、文字列は、たとえば、文字のシーケンスとちょうど)。 x.foreach(println)
の呼び出しは、 all String
sにとって意味があります。
一方、タイプ A
のオブジェクトをタイプ B のオブジェクトとして使用できる場合は、より明示的な変換を使用する必要がありますコード>。あなたの例では、
foo(" bar")
の呼び出しは意味をなさず、エラーをスローします。 Scalaにはチェックされた例外がないため、 foo(s.toDate)
の呼び出しは、例外がスローされる可能性があることを明確に示します( s
は有効な日付ではない可能性があります)。また、 foo(" bar" .toDate)
は明らかに間違っているように見えますが、ドキュメントを参照して foo(" bar")
が間違っている理由を確認する必要があります。 Scala標準ライブラリでのこの例は、 RichString <の
toInt
メソッドを介した、 String
sから Int
sへの変換です。 / code>ラッパー( String
は Int
として見ることができますが、常にではありません)。
他のヒント
XからYへの暗黙の変換(上記のStringからDateへの変換のような)を行うとき、あなたは本質的に、そもそもXの記述を完全に制御できていれば、Xまたは、Yのサブクラスになります。
XがYを実装することが理にかなっている場合、変換を追加します。そうでない場合は、おそらく適切ではありません。たとえば、StringがRandomAccessSeq [Char]を実装するのは理にかなっていますが、StringがDateを実装するのは理にかなっていないかもしれません(StringDateを実装するStringは問題ないと思われます)。
(私は少し遅れており、Flaviuは優れた答えを持っていますが、暗黙のことについてどう思うかについてコメントを追加したかったです。)