cod*_*ool 18 methods scala parentheses
在Scala中,有两种方法可以定义一个不带参数的方法
1 def a=println("hello")
2 def a()=println("hello")
Run Code Online (Sandbox Code Playgroud)
这两种方法完全相同,但(2)可以使用和不使用括号来调用.
在Scala中是否有任何特殊原因允许使用此功能.它会让我感到困惑,何时使用?
Jea*_*let 21
一般规则是,只要方法(非函数)有副作用,就应该在声明站点和调用站点添加空参数列表.
否则,Scala具有统一访问原则,因此客户端无需知道他们是在访问字段还是调用无副作用的方法.
Dan*_*ral 10
允许使用不带括号的语法,因此可以写下:
abstract class X {
def f: Int
}
class Y extends X {
val f = 0
}
Run Code Online (Sandbox Code Playgroud)
调用代码f
上X
并不需要知道,如果它是一个val
或一个def
.
在调用具有空列表的方法时,可以省略括号的原因是允许调用理想情况下不具有括号的Java方法(但是,因为它们是Java,所以它们都具有括号).
正如其他人所说,当方法具有副作用时,存在使用空参数列表的惯例,否则将其关闭.
无论您选择使用括号来表示副作用方法调用,都是一种风格问题.
顺便说一下,如果你声明一个纯粹的副作用方法=
,你应该显式声明一个Unit
返回类型,如下所示:
def a: Unit = println("hello")
Run Code Online (Sandbox Code Playgroud)
请注意,任何类型都可以强制执行Unit
.
如果您不想显式声明返回类型,则应该省略=
.然后编译器将推断返回类型Unit
,即使最后一个表达式返回不同的东西:
def a() { println("hello") }
Run Code Online (Sandbox Code Playgroud)
上述两种样式都使重构更安全,因为修改方法体永远不会导致编译器推断出不同的返回类型.IMO这种声明的明确性比呼叫站点代码风格更重要.