Scala 自定义运算符(abs 示例)

use*_*596 3 scala operator-overloading operators

我知道 scala 允许重载它的默认运算符(+、-!等)。是否可以定义自定义运算符并制作类似 |.| 的内容 运算符使得 | -3| 其计算结果为 3。或者定义像 ++++ 这样的运算符,以便 ++++ b 等于 a+3*b?

Ass*_*son 6

您应该查看scala 运算符文档

您可以轻松地创建 ++++ 运算符,但不能创建 |.| 操作员。

scala 中的运算符只是具有非字母数字名称的函数。由于 scala 还支持调用 af(b) 作为 afb 那么你可以实现第一个行为。例如:

case class A(v: Int) {
  def ++++(b: A): A = A(v + 3 * b.v)
}

val a = A(1)
val b = A(2)
a ++++ b
>> A(7)
a.++++(b) // just another way of doing the exact same call
Run Code Online (Sandbox Code Playgroud)

如果你想将其添加到整数中,你只需创建一个隐式类来添加它。

另一种选择是为运算符添加前缀,例如考虑使用 -a 来获取负数。没有“第一个元素”可以应用 - ,而是 - 应用于 a (请参阅此答案)。

例如:

case class A(v: Int) {
  def unary_!(): Int = -v
}
val a = A(3)
!a
>> -3
Run Code Online (Sandbox Code Playgroud)

做|.| 有两个问题:首先,运算符有两个部分,即它是分裂的。第二个是使用 |

为了执行两部分运算符(例如!.!),您可能希望生成一些私有类型并从其中返回它!然后将其用作另一个的输入以返回输出类型。

第二个问题是 | 的使用 这是非法字符。查看此答案以获取合法字符列表