是否有可能/如何在Scala中重载函数调用操作符?

时间:2018-01-23 15:42:18

标签: scala operator-overloading

我读过,在Scala中你可以重载任何运算符,而不是像Groovy那样。但是我没有看到如何重载函数调用的任何例子。

是否有可能/如何在Scala中重载函数调用操作符?

我知道“Scala中没有运营商”,但尽管如此,我还是应该按照我的名字去做。

2 个答案:

答案 0 :(得分:3)

函数调用拼写为apply。任何具有名为apply的方法的对象都会重载函数调用。

class Functionish(val int: Int, val str: String) {
  def apply(i: Int): Int = i + int
  def apply(s: String): String = s + str + s
}

val f = new Functionish(42, "hello")

println(f(4))
println(f("George, "))

打印

46
George, helloGeorge, 

值得注意的是:案例类伴随对象重载apply。这就是您可以使用

创建案例类实例的原因
val instance = CaseClass(foo, bar, baz)

而不是

val instance = new CaseClass(foo, bar, baz)

答案 1 :(得分:0)

每个“可调用”对象都是通过apply方法调用的:

scala> def foo(i: Int) = i * i
foo: (i: Int)Int

scala> val f = foo _
f: Int => Int = <function1>

scala> f(42)
res2: Int = 1764

scala> f.apply(42)
res3: Int = 1764

你在找什么?