我是Scala的绝对初学者,在阅读其中一本应用函数的Scala书籍后,就像“重载()运算符”我开始想知道如何定义。即,operator()将在括号之间采用参数,而不是传统的中缀a()b表示法。在Scala中是否可以定义此类运算符?如果是,那么定义语法是什么?感谢。
答案 0 :(得分:3)
正如您在问题中所述,您只需定义一个名为apply
的方法(不一个函数)来定义它。
foo(bar, baz)
被翻译为
foo.apply(bar, baz)
因此,只要foo
具有正确的arity和类型的apply
方法,这就行了。
apply
方法实现的一些示例是Array
伴随对象,它允许您通过调用Array(1, 2, 3)
(实际上只是Array.apply(1, 2, 3)
)来构造数组以及Array
类,它允许您通过调用anArray(i)
(实际上只是anArray.apply(i)
)来访问数组元素。
这类似于例如Python,其中函数调用被转换为对__call__
运算符或Ruby的调用,其中foo.(bar, baz)
形式的表达式被转换为foo.call(bar, baz)
。
类似的方法是update
:
foo(bar) = baz
被翻译为
foo.update(bar, baz)