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

时间:2017-06-27 13:47:49

标签: scala operator-overloading operators

我知道scala允许对其默认运算符(+, - !等)进行重载。是否可以定义自定义运算符并生成类似|。|的内容运算符使| -3 |评估为3.或者定义像++++这样的运算符,使得++++ b等于+ 3 * b?

2 个答案:

答案 0 :(得分:2)

你应该看看scala operators documentation

您可以轻松制作++++运算符,但不能制作|。|操作

scala中的运算符只是具有非字母数字名称的函数。由于scala也支持将a.f(b)调用为f b,因此您可以实现第一个行为。例如:

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

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

另一种选择是为运营商添加前缀,例如考虑做-a来得到负数。没有"第一个元素"应用 - 来代替 - 应用于(见this answer)。

例如:

case class A(v: Int) {
  def unary_!(): Int = -v
}
val a = A(3)
!a
>> -3

做|。|有两个问题:首先,运营商有两个部分,即它是分开的。第二个是使用|

为了做一个两部分操作符(比如说!。)你可能想要生成一些私有类型并从一个返回它!然后将其用作另一个的输入以返回输出类型。

第二个问题是使用|这是一个非法的角色。查看this answer以获取合法字符列表

答案 1 :(得分:0)

扩展@assaf-mendelson回答

的示例
case class Abs(a: Int) {
  def !(): Int = a.abs
}

implicit def toAbs(a: Int) = new {
  def unary_! : Abs = Abs(a)
}

然后

> val a = -3
a: Int = -3

> !a
res0: Abs = Abs(-3)

> !a!
res1: Int = 3

> val b = 12
b: Int = 12

> !b!
res2: Int = 12

> (!a!) + (!b!)
res3: Int = 15

我们无法将|a|实施为abs,因为unary_仅适用于!~+-