- 此问题在此处已有答案**:
11年前关闭了。
- 可能重复:**
Functions vs methods in Scala
What is the difference between def foo = {} and def foo() = {} in Scala?
在scala中我们可以定义
def foo():Unit = println ("hello")
或
def foo:Unit = println ("hello")
我知道它们不一样,但有什么区别,什么时候应该使用哪个?
如果这个问题已经回答过了,请指向我的链接。
1条答案
按热度按时间oxiaedzo1#
0元的Scala 2.x方法可以定义为带或不带括号
()
。这是用来通知用户该方法有某种副作用(如打印输出到标准输出或销毁数据),而不带括号的方法稍后可以实现为val
。请参见Scala中的编程:
这样的无参数方法在Scala中很常见,相反,使用空括号定义的方法,如def height():Int称为empty-paren方法。推荐的约定是,当没有参数时,使用无参数方法,并且该方法仅通过读取包含对象的字段来访问可变状态(特别是,它不改变可变状态)。
该公约支持统一准入原则[.]
总而言之,Scala的风格鼓励将不带参数且没有副作用的方法定义为无参数方法,也就是说,不要使用空括号。另一方面,永远不要定义没有括号但有副作用的方法,因为那样的话,对该方法的调用看起来就像是一个字段选择。
术语
关于0元方法有一些令人困惑的术语,所以我将在这里创建一个表:
| | Scala编程|scala术语|
| - ------| - ------| - ------|
|
def foo: Int
|无参数方法|零值法||
def foo(): Int
|空双亲法|零元法|说"空方法"听起来很酷,但人们经常说错,读者也会感到困惑,所以我建议坚持使用无参数方法和空括号方法,除非你是在一个拉取请求中,人们已经在使用这些术语。
()在Scala 2.13或3.0中不再是可选的
在The great () insert中,Martin Odersky对Scala 3进行了修改,要求
()
调用用()
定义的方法。这在Scala 3迁移指南中记录为:自动应用是调用空方法而不传递空参数列表的语法。
自动应用是调用 * empty-paren *(或"nilary")方法而不传递空参数列表的语法。
Scala 2.13继承了Scala 3.x的功能,不再支持Eta-expand 0-arity method if expected type is Function0中自动应用empty-paren方法。Java定义的方法是一个明显的例外。我们可以继续调用Java方法,比如
toString
,而不使用()
。