为什么我们定义`def hello()=“world”,但我们可以将它调用为“hello”?

时间:2014-08-24 16:45:14

标签: scala

如果我们有方法:

def hello() = "world"

我告诉我们可以将其称为:

hello()

hello

他们都工作并输出world,但为什么?


PS:

我在https://stackoverflow.com/a/12340289/342235中看到了一些字词:

  

不,实际上,他们不是。尽管它们都调用了一个没有参数的方法,但是一个方法是零参数列表"而另一个是带有一个空参数列表"

的"方法

但我仍然不明白为什么hello会起作用

2 个答案:

答案 0 :(得分:3)

Scala允许在arity-0(无参数)方法上省略括号:

虽然

没有对invokation的副作用,但你应该只省略括号

http://docs.scala-lang.org/style/method-invocation.html

答案 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#之类的语言相反,其中,中缀运算符实际上是使用特殊语法糖的静态方法让它们表示为中缀)。