【问题标题】:Difference between function with parentheses and without [duplicate]带括号和不带括号的函数之间的区别[重复]
【发布时间】:2011-11-27 21:24:09
【问题描述】:

可能重复:
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")

我知道它们不一样,但有什么区别,什么时候应该使用?

如果之前已经回答了这个问题,请指向该链接。

【问题讨论】:

标签: scala


【解决方案1】:

Scala 2.x 的 0-arity 方法可以使用或不使用括号 () 来定义。这用于向用户表明该方法具有某种副作用(例如打印到标准输出或破坏数据),而不是没有的,稍后可以将其实现为val

Programming in Scala:

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

此约定支持统一访问原则 [...]

总而言之,Scala 鼓励风格将不带参数且没有副作用的方法定义为无参数方法,即省略空括号。另一方面,你永远不应该定义一个没有括号的有副作用的方法,因为那样的话,对该方法的调用看起来就像一个字段选择。

术语

关于 0-arity 方法有一些令人困惑的术语,所以我将在这里创建一个表:

Programming in Scala scala/scala jargon
def foo: Int parameterless methods nullary method
def foo(): Int empty-paren methods nilary method

我说“nullary method”听起来很酷,但经常有人说错了,读者也会感到困惑,所以我建议坚持使用无参数方法和空括号方法,除非你在人们所在的拉取请求中已经在使用行话了。

() 在 Scala 2.13 或 3.0 中不再是可选的

The great () insert 中,Martin Odersky 对 Scala 3 进行了更改,要求() 调用使用() 定义的方法。这在Scala 3 Migration Guide 中记录为:

自动应用是在不传递空参数列表的情况下调用空方法的语法。

注意:迁移文档使用错误的术语。它应该读作:

自动应用是在不传递空参数列表的情况下调用 empty-paren(或“nilary”)方法的语法。

Scala 2.13,紧随 Scala 3.x,并在 Eta-expand 0-arity method if expected type is Function0 中弃用了空括号方法的自动应用。此规则的一个显着例外是 Java 定义的方法。没有(),我们可以继续调用toString等Java方法。

【讨论】:

猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2023-03-19
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多