可能的重复:
Scala 中的函数与方法 https://stackoverflow.com/questions/4839537/functions-vs-methods-in-scala
Scala 中 def foo = {} 和 def foo() = {} 有什么区别? https://stackoverflow.com/questions/7409502/what-is-the-difference-between-def-foo-and-def-foo-in-scala
在scala中我们可以定义
def foo():Unit = println ("hello")
or
def foo:Unit = println ("hello")
我知道它们不一样,但有什么区别,什么时候应该使用哪个?
如果之前已回答过此问题,请指出该链接。
可以使用或不使用括号来定义 0 元数的 Scala 2.x 方法()
。这用于向用户发出信号,表明该方法有某种副作用(例如打印到标准输出或破坏数据),而不是没有副作用,稍后可以将其实现为val
.
See Scala 编程 http://www.artima.com/pins1ed/composition-and-inheritance.html#i1343251059-1:
这种无参数方法在 Scala 中很常见。相比之下,使用空括号定义的方法(例如 def height(): Int)称为空括号方法。推荐的约定是,只要没有参数,就使用无参数方法,并且该方法仅通过读取包含对象的字段来访问可变状态(特别是,它不会更改可变状态)。
该约定支持统一访问原则 [...]
总而言之,Scala 中鼓励将不带参数且无副作用的方法定义为无参数方法,即省略空括号。另一方面,您永远不应该定义一个没有括号的有副作用的方法,因为这样该方法的调用看起来就像一个字段选择。
术语
关于 0 数量方法有一些令人困惑的术语,所以我将在这里创建一个表:
|
Programming in Scala |
scala/scala jargon |
def foo: Int |
parameterless methods |
nullary method |
def foo(): Int |
empty-paren methods |
nilary method |
说“无效方法”可能听起来很酷,但人们常常说错了,读者也会感到困惑,所以我建议坚持使用无参数方法与空括号方法,除非你处于人们已经在使用的拉取请求中行话。
() 在 Scala 2.13 或 3.0 中不再是可选的
In 伟大的()插入 https://github.com/lampepfl/dotty/pull/2716,Martin Odersky 对 Scala 3 进行了更改,要求()
调用定义的方法()
。这记录在Scala 3 迁移指南 https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/dropped-features.html#auto-application as:
自动应用是调用空方法而不传递空参数列表的语法。
Note: 迁移文档中的术语有误。它应该读作:
自动应用程序的语法是调用空括号(或“nilary”)方法,无需传递空参数列表。
Scala 2.13 遵循 Scala 3.x 并弃用了空括号方法的自动应用如果预期类型为 Function0,则 eta-expand 0-arity 方法 https://github.com/scala/scala/pull/7660。此规则的一个值得注意的例外是 Java 定义的方法。我们可以继续调用Java方法,例如toString
没有()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)