在Scala中def foo = {}和def foo()= {}有什么区别?

鉴于在Scala中定义一个函数的下列结构,你能解释一下这个区别是什么,它的含义是什么?

def foo = {} 

 def foo() = {} 

更新

感谢您的快速回复。 这些都很棒。 我唯一的问题是:

如果我省略括号,是否还有一种方法来传递函数呢? 这是我得到的repl:

 scala> def foo = {} foo: Unit scala> def baz() = {} baz: ()Unit scala> def test(arg: () => Unit) = { arg } test: (arg: () => Unit)() => Unit scala> test(foo) <console>:10: error: type mismatch; found : Unit required: () => Unit test(foo) ^ scala> test(baz) res1: () => Unit = <function0> 

更新2012-09-14

以下是我注意到的一些类似的问题:

  1. function与括号和不带的区别
  2. 没有参数的Scala方法

如果在定义中包含括号,则在调用方法时可以select省略括号。 如果在定义中忽略它们,则在调用方法时不能使用它们。

 scala> def foo() {} foo: ()Unit scala> def bar {} bar: Unit scala> foo scala> bar() <console>:12: error: Unit does not take parameters bar() ^ 

另外,你可以用你的高阶函数做类似的事情:

 scala> def baz(f: () => Unit) {} baz: (f: () => Unit)Unit scala> def bat(f: => Unit) {} bat: (f: => Unit)Unit scala> baz(foo) scala> baz(bar) <console>:13: error: type mismatch; found : Unit required: () => Unit baz(bar) ^ scala> bat(foo) scala> bat(bar) // both ok 

这里baz只会拿foo()而不是bar 。 这是什么使用,我不知道。 但它确实表明了types是不同的。

让我复制我的答案我张贴在一个重复的问题 :

0-arity的Scala方法可以用或不用括号()来定义。 这用于向用户发出信号,告诉用户该方法具有某种副作用(如打印输出或销毁数据),而不是没有的方式,这可以稍后以valforms实现。

请参阅Scala编程 :

这种无参数方法在Scala中很常见。 相反,使用空括号定义的方法(如def height():Int)称为空白方法。 推荐的约定是在没有参数的情况下使用无参数方法,并且只通过读取包含对象的字段(特别是不会改变可变状态)来访问可变状态。

这个惯例支持统一访问原则[…]

总而言之,在Scala中鼓励样式来定义不带参数且无副作用的方法,也就是说,不要使用空括号。 另一方面,你永远不应该定义一个没有括号的副作用的方法,因为那么调用这个方法看起来就像是一个字段select。

要回答第二个问题,只需添加一个_

 scala> def foo = println("foo!") foo: Unit scala> def test(arg: () => Unit) = { arg } test: (arg: () => Unit)() => Unit scala> test(foo _) res10: () => Unit = <function0> scala> test(foo _)() foo! scala>