Scala 如何将运算符重新定义为函数?

Scala 如何将运算符重新定义为函数?,scala,oop,Scala,Oop,我一直在考虑一种方法,当我为一个类创建新代码时,可以停止重复自己的操作,例如,当同一个类出现时,我需要对一个case类中的所有值求和 举个例子可以更好地解释我目前正在做的事情: case class A(a: Double, b: Double) { def +(that: A): A { A(a + that.a, b + that.b) } def *(that: A): A { A(a * that.a, b * that.b)

我一直在考虑一种方法,当我为一个类创建新代码时,可以停止重复自己的操作,例如,当同一个类出现时,我需要对一个case类中的所有值求和

举个例子可以更好地解释我目前正在做的事情:

case class A(a: Double, b: Double) {
    def +(that: A): A {
        A(a + that.a, b + that.b)
    }
    def *(that: A): A {
        A(a * that.a, b * that.b)
    }
}
这让我可以做:

val a = A(1, 2)
val b = A(3, 4)
val c = a + b
其中
c=A(4,6)
,对吗

那么,如果我想推广这个操作呢?例如,让我给你举一个例子,说明某件事不起作用,但我相信它完美地描述了我的意图

case class A(a: Double, b: Double) {
    def operation(op: (x: Double, y: Double) => Double)(that: => A) = {
        A(op(a, that.a), op(b, that.b))
    }
}
现在,我知道这是行不通的,因为我可能混淆了一些非常重要的概念,我还没有明确指出这些概念,但我想到了这种可能性:

val a = A(1, 2)
val b = B(3, 4)
val + = (x: Double, y: Double) => (x + y)
val res = a + b

我知道这可以通过不同的方式实现,从而获得相同的结果,但有没有一种方法可以像这样描述通用操作?

您可以这样做:

case class A(a: Double, b: Double) {
  def + = operation(_ + _) _
  def * = operation(_ * _) _

  private def operation(op: (Double, Double) => Double)(that: => A) =
    A(op(a, that.a), op(b, that.b))
}

您可以这样做:

case class A(a: Double, b: Double) {
  def + = operation(_ + _) _
  def * = operation(_ * _) _

  private def operation(op: (Double, Double) => Double)(that: => A) =
    A(op(a, that.a), op(b, that.b))
}

不太清楚你在找什么,但也许这很接近

case class A(a: Double, b: Double) {
  def @@(that:A): ((Double, Double) => Double) => A =
    op => A(op(a, that.a), op(b, that.b))
}
用法:

val a = A(7, 2)
val b = A(3, 4)

(a @@ b)(_+_)      // res0: A = A(10.0,6.0)
(a @@ b)(_*_)      // res1: A = A(21.0,8.0)
(a @@ b)(Math.min) // res2: A = A(3.0,2.0)

不太清楚你在找什么,但也许这很接近

case class A(a: Double, b: Double) {
  def @@(that:A): ((Double, Double) => Double) => A =
    op => A(op(a, that.a), op(b, that.b))
}
用法:

val a = A(7, 2)
val b = A(3, 4)

(a @@ b)(_+_)      // res0: A = A(10.0,6.0)
(a @@ b)(_*_)      // res1: A = A(21.0,8.0)
(a @@ b)(Math.min) // res2: A = A(3.0,2.0)

这正是我想要的!非常感谢。这正是我想要的!非常感谢。这非常接近,是我找到的一个解决方案,但我想说得更清楚一些。不过,谢谢你!这非常接近,是我找到的一个解决方案,但我想说得更清楚一些。不过,谢谢你!