Scala自定义操作符(例如abs)

12 浏览
0 Comments

Scala自定义操作符(例如abs)

我知道Scala允许对默认运算符(+,-!等)进行重载。是否可以定义自定义运算符,比如| . |运算符,使| -3 |求值为3。或者定义一个像++++这样的运算符,使a ++++ b等于a + 3 * b?

0
0 Comments

Scala自定义运算符(例如abs)的出现原因是为了在Scala中实现自定义的绝对值运算符。然而,由于Scala中的unary_运算符只适用于!、~、+和-,无法直接实现绝对值运算符|a|。

为了解决这个问题,可以通过扩展现有的类型或创建新的类型来实现自定义的运算符。在给定的示例中,通过创建一个名为Abs的case class来定义绝对值运算符。然后,通过使用implicit关键字将Int类型转换为Abs类型,以便可以对其应用自定义的绝对值运算符。

以下是实现自定义运算符的代码示例:

case class Abs(a: Int) {
  def !(): Int = a.abs
}
implicit def toAbs(a: Int) = new {
  def unary_! : Abs = Abs(a)
}

使用这些自定义运算符的示例代码如下:

val a = -3
val b = 12
!a // 返回Abs(-3)
!a! // 返回3
!b! // 返回12
(!a!) + (!b!) // 返回15

然而,需要注意的是,这段代码在Scala 3和Scala 2(3.1.3和2.11.12)中都无法正常工作。因此,如果要在Scala中实现自定义的绝对值运算符,需要寻找其他解决方案。

0
0 Comments

Scala自定义运算符(例如abs)的问题出现的原因是Scala中的运算符实际上是具有非字母数字名称的函数。为了实现abs这个例子,可以使用函数调用的形式a.f(b)来实现,也可以使用a f b的形式来实现。如果要将abs添加到整数中,可以创建一个隐式类来添加它。另一种选择是使用运算符前缀,例如使用-a来获得负数。但是对于|.|运算符存在两个问题:首先,运算符被分为两部分;第二是使用|符号,但在Scala中|是一个非法字符。虽然在提供的答案中|被列为合法字符,但实际上在REPL中该字符似乎无效。然而,作为方法使用是正常的。因此,要实现|.|运算符将会非常笨拙。

0