2011-10-31 16 views
7

Scala:同じ宣言を持つ2つの暗黙の引数

私は次のクラスを持っています:

class Example(implicit doSomething1: (Double, Double) => Double, implicit doSomething2: (Double, Double) => Double) 
{ 
    //.. 
} 

同じように、コンストラクターには同じ宣言を持つ2つの暗黙の引き数(関数)があります。しかし、私は2つの異なる定義を「注入」したい。これは暗黙の方法で可能ですか?または、それは既知の明示的な方法でのみ可能ですか?

ありがとう

答えて

0

書き込み

class Example(implicit doSomething1: (Double, Double) => Double, doSomething2: (Double, Double) => Double) 
{ 
    //.. 
} 

しかし、2つの暗黙の引数が同じ型を持っている場合、彼らは明らかに(あなたはまだ明示的に異なる引数を渡すことができます)と同じ値を持つことになります。

8

コンパイラが暗黙スコープ内でimplicit (Double, Double) => Doubleを検索する場合、高い優先度を持つものが1つだけあり、そのどちらかを両方選択するか、暗黙のスコープ内にないか1つは最も優先度が高い)、暗黙の値がないためにエラーが発生します。

区別したい場合は、Function2 [Double、Double、Double]の2つのタイプがあります。たとえば、

trait Addition extends Function[Double, Double, Double] 
trait Multiplication extends Function[Double, Double, Double] 
class Example(implicit addition: Addition, implicit multiplication: Multiplication) 

これは両方の操作を独立して選択することができます。二つの選択肢がconistentする必要がある場合は、それだけで1つの形質を持っているより多くの意味をなすかもしれない両方の操作で

trait Ring { 
    def add(x: Double, y: Double): Double 
    def mult(x: Double, y: Double): Double 
} 
// or `case class Ring(
//  addition: (Double, Double) => Double, 
//  multiplication: (Double, Double) => Double) 
class Example(implicit ring: Ring) 

最後に、このすべては、あなたが「自然」暗黙の範囲で適切な操作を取得する場合にのみ有効です。

implicit val addition = ... 
implicit val multiplication = 
new Example 

などの例を作成するたびに暗黙的にする必要がある場合は、明示的にすることもできます。呼び出しのほとんどが同じ値で動作するように期待される、とされている場合

また、あなただけそれらのいくつかを変更したい、あなたではなく、デフォルト値を引数のために行くかもしれません

class Example(doSomething1 : (Double, Double) => Double = <default value>, doSomething2 ...) 

あなたも持っていること両方ともデフォルト値を持つ暗黙の引数です。これを行うと、暗黙的なものが見つからない場合にデフォルト値が使用されます。

関連する問題