如果我们有方法:
def hello() = "world"
我告诉我们可以将其称为:
hello()
也
hello
他们都工作并输出world
,但为什么?
PS:
我在https://stackoverflow.com/a/12340289/342235中看到了一些字词:
不,实际上,他们不是。尽管它们都调用了一个没有参数的方法,但是一个方法是零参数列表"而另一个是带有一个空参数列表"
的"方法
但我仍然不明白为什么hello
会起作用
答案 0 :(得分:3)
Scala允许在arity-0(无参数)方法上省略括号:
虽然
没有对invokation的副作用,但你应该只省略括号答案 1 :(得分:0)
正如 Oliver Shaw的回答中所述,Scala允许您在带有0个参数的函数中省略括号。至于为什么,它可能有助于轻松重构。
如果你的函数没有参数,并且不产生副作用,它等同于一个不可变的值。如果你总是在没有括号的情况下调用这些函数,那么你可以自由地将函数的基础定义更改为一个值,而不必在它所引用的任何地方重构它。
值得注意的是,val
定义实际上是在scala中建模为0-arity方法(除非事先用private final
指定)。
Scala在处理类上定义的arity-1函数方面做了类似的事情。您可以省略点和括号。例如:
case class Foo(value: String) {
def prepend(value2: String) = Foo(value2 + value)
}
Foo("one").prepend("two")
// is the same as...
Foo("one") prepend "two"
这是因为Scala将所有运算符建模为arity-1函数。您可以将1 + 2
重写为1.+(2)
并让它具有相同意义。将运算符表示为完全成熟的函数具有一些很好的特性。您可以期望在可以传递函数的任何地方传递运算符,并且实际上为类实例定义运算符的定义(与C#之类的语言相反,其中,中缀运算符实际上是使用特殊语法糖的静态方法让它们表示为中缀)。