2011-10-31 68 views
7

隱含參數我有以下類:斯卡拉:兩個具有相同的聲明

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

正如你所看到的構造具有相同的聲明兩個隱含的參數(功能)。但我想「注入」兩個不同的定義。這可能以一種隱含的方式嗎?或者只有以已知的明確方式纔有可能?

感謝

回答

0

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

但如果兩個隱含的參數具有相同的類型,他們顯然將具有相同的值(你還可以通過不同的參數明確)。

8

如果編譯器會在隱式作用域的implicit (Double, Double) => Double,要麼恰好有一個具有更高的優先級,它會選擇一個兩次,或不存在(無論有沒有在所有的隱含範圍,或超過一個具有最高優先級),並且缺少隱式值將會出錯。

如果你想區分,你可能有兩種不同的類型,都擴展Function2 [Double,Double,Double]。例如

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

這可能沒問題,選擇兩個獨立的操作是有意義的。如果兩個選擇需要被conistent,它可能會更有意義,只有一個特徵既操作

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 ...) 

你甚至可以有兩者都是默認值的隱含參數。如果這樣做,則在未找到隱式時使用默認值。