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