隐含参数我有以下类:斯卡拉:两个具有相同的声明
class Example(implicit doSomething1: (Double, Double) => Double, implicit doSomething2: (Double, Double) => Double)
{
//..
}
正如你所看到的构造具有相同的声明两个隐含的参数(功能)。但我想“注入”两个不同的定义。这可能以一种隐含的方式吗?或者只有以已知的明确方式才有可能?
感谢
隐含参数我有以下类:斯卡拉:两个具有相同的声明
class Example(implicit doSomething1: (Double, Double) => Double, implicit doSomething2: (Double, Double) => Double)
{
//..
}
正如你所看到的构造具有相同的声明两个隐含的参数(功能)。但我想“注入”两个不同的定义。这可能以一种隐含的方式吗?或者只有以已知的明确方式才有可能?
感谢
写
class Example(implicit doSomething1: (Double, Double) => Double, doSomething2: (Double, Double) => Double)
{
//..
}
但如果两个隐含的参数具有相同的类型,他们显然将具有相同的值(你还可以通过不同的参数明确)。
如果编译器会在隐式作用域的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 ...)
你甚至可以有两者都是默认值的隐含参数。如果这样做,则在未找到隐式时使用默认值。