在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
以下是我注意到的一些类似的问题:
- function与括号和不带的区别
- 没有参数的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方法可以用或不用括号()
来定义。 这用于向用户发出信号,告诉用户该方法具有某种副作用(如打印输出或销毁数据),而不是没有的方式,这可以稍后以val
forms实现。
请参阅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>