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