2011-10-31 67 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 ...) 

你甚至可以有两者都是默认值的隐含参数。如果这样做,则在未找到隐式时使用默认值。