use*_*465 7 arguments scala implicit
我有以下课程:
class Example(implicit doSomething1: (Double, Double) => Double, implicit doSomething2: (Double, Double) => Double)
{
//..
}
Run Code Online (Sandbox Code Playgroud)
如您所见,构造函数有两个具有相同声明的隐式参数(函数).但我想"注入"两个不同的定义.这可能是隐含的吗?或者只能以已知的显式方式进行?
谢谢
Did*_*ont 10
如果编译器查找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)
Run Code Online (Sandbox Code Playgroud)
这可能是合理的,可以独立选择两种操作.如果这两个选择需要一致,那么只有一个特征可能更有意义
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)
Run Code Online (Sandbox Code Playgroud)
最后,只有在"自然地"在隐式范围内获得正确的操作时,所有这些才有用.如果你每次创建一个例子时都必须隐藏它们,比如
implicit val addition = ...
implicit val multiplication =
new Example
Run Code Online (Sandbox Code Playgroud)
你也可以明确.
此外,如果预期大多数调用都使用相同的值,并且您只想更改其中的一些,则可能更愿意使用默认值
class Example(doSomething1 : (Double, Double) => Double = <default value>, doSomething2 ...)
Run Code Online (Sandbox Code Playgroud)
您甚至可以同时使用默认值的隐式参数.如果这样做,则在未找到隐式时使用默认值.
写
class Example(implicit doSomething1: (Double, Double) => Double, doSomething2: (Double, Double) => Double)
{
//..
}
Run Code Online (Sandbox Code Playgroud)
但是,如果两个隐式参数具有相同的类型,那么它们显然将具有相同的值(您仍然可以显式传递不同的参数)。