scala 带括号和不带[duplicate]的函数之间的差异

fsi0uk1n  于 2023-01-09  发布在  Scala
关注(0)|答案(1)|浏览(122)
    • 此问题在此处已有答案**:

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")

我知道它们不一样,但有什么区别,什么时候应该使用哪个?
如果这个问题已经回答过了,请指向我的链接。

oxiaedzo

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,而不使用()

相关问题