gpt4 book ai didi

Scala:具有相同声明的两个隐式参数

转载 作者:行者123 更新时间:2023-12-04 11:13:46 25 4
gpt4 key购买 nike

我有以下类(class):

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

如您所见,构造函数有两个具有相同声明的隐式参数(函数)。但我想“注入(inject)”两个不同的定义。这可能以一种隐含的方式吗?还是只能以已知的显式方式进行?

谢谢

最佳答案

如果编译器查找 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)

这可能没问题,独立选择这两种操作是有意义的。如果这两个选择需要保持一致,那么两种操作都只有一个特征可能更有意义
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  ...)

你甚至可能同时拥有它,一个具有默认值的隐式参数。如果这样做,则在未找到隐式时使用默认值。

关于Scala:具有相同声明的两个隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7957889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com