2011-11-09 3 views
4

可能性の重複:
How can I chain implicits in Scala?Scalaは1つの式で複数の暗黙的な変換を適用できますか?

Scalaは一つの式に複数の暗黙の型変換を適用することはできますか?

case class Wrapper(s: String) 

    case class WrapperWrapper(w: Wrapper) 

    implicit def string2Wrapper(s: String) = Wrapper(s) 

    implicit def wrapper2WrapperWrapper(w: Wrapper) = WrapperWrapper(w) 

    // implicit conversation --> w = string2Wrapper("w") 
    val w: Wrapper = "w" 

    // implicit conversation --> ww = wrapper2WrapperWrapper(w) 
    val ww: WrapperWrapper = w 

    // does NOT compile! 
    // ideally --> sad = wrapper2WrapperWrapper(string2Wrapper("ww")) 
    val sad: WrapperWrapper = "ww" 

最後の行で「ダブル」の変換作業を取得するにはどのような方法があります:

は、この単純な例を考えてみましょうか?

私のような別の暗黙的に定義することによって沿って物事を助けることができる:

implicit def string2WrapperWrapper(s:String) = wrapper2WrapperWrapper(s) 

が、それは必要ありませんように思える...

答えて

5

私は私が持っていない怖いです簡潔な手引き(答えは6.26と第7章The Scala Language Specificationに散在している)が、回答はで、である。

これは実用性に起因するものです.2回の暗黙的な変換により、使用可能な変換の数が2倍になり、衝突の可能性が大幅に増加し、特定の変換で起こることを正確に実行することが難しくなります。

StringからWrapperWrapperへの変換を自分で宣言する必要はありません。実際にこれを行う必要がほとんどないことを考えると、二重の潜在的な混乱の潜在的な混乱と比較して、私はそれを2つの悪のうちの小さいものと見なします。

5

あなたはかなり簡潔な変換の順序を強制することができます

@Andrzejドイルによって説明したように
scala> val sad: WrapperWrapper = ("ww": Wrapper)   
sad: WrapperWrapper = WrapperWrapper(Wrapper(ww)) 

は、一度に2つの変換が起こって不慮の変換のリスクを拡大し、それがdissallowedされます。

関連する問題