gpt4 book ai didi

scala - 双向运算符

转载 作者:行者123 更新时间:2023-12-01 11:53:32 26 4
gpt4 key购买 nike

给定以下 n 维数据点:

class Point private (private val data: Array[Double]) {

private def op(other: Point)(f: (Double, Double) => Double): Point = {
for (i <- data.indices)
data(i) = f(data(i), other.data(i))
this
}

private def op(scalar: Double)(f: (Double, Double) => Double): Point = {
for (i <- data.indices)
data(i) = f(data(i), scalar)
this
}

// Point scalar ops
def +(scalar: Double): Point = op(scalar)(_ + _)
def -(scalar: Double): Point = op(scalar)(_ - _)
def *(scalar: Double): Point = op(scalar)(_ * _)
def /(scalar: Double): Point = op(scalar)(_ / _)

// Point Point ops
def +(other: Point): Point = op(other)(_ + _)
def -(other: Point): Point = op(other)(_ - _)
def *(other: Point): Point = op(other)(_ * _)
def /(other: Point): Point = op(other)(_ / _)


override def toString: String = {
"Point(" + data.map(_.toString).mkString(", ") + ")"
}
}

object Point {
def apply(data: Double*): Point = new Point(Array(data:_*))
}

我可以做以下事情:

val p1 = Point(1,2,3)
println(p1 + 3) // Point(4.0, 5.0, 6.0)

但是,我也希望有一个“双向”行为:

val p1 = Point(1,2,3)
println(3 + p1)

有什么方法可以在 Scala 中实现吗?

最佳答案

是的,你可以。使用implicit class标量 值创建丰富的包装器。

implicit class ScalarOps (val scalar: Double) extends AnyVal {
def + (point: Point): Point = point + scalar
// Other methods...
}

val p = Point(1, 2, 3)
1 + p // res0: Point = Point(2, 3, 4)

请注意,我将隐式类与 value class 组合在一起,因此在大多数情况下您的包装器并未真正实例化。

关于scala - 双向运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54430911/

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