23

在 Scala 中,有两种方法可以定义不带参数的方法

    1 def a=println("hello")

    2 def a()=println("hello")

这两种方法完全相同,但 (2) 可以带括号和不带括号来调用。

在 Scala 中允许使用此功能是否有任何特殊原因。它让我困惑何时使用哪个?

4

3 回答 3

25

一般规则是,只要方法(不是函数)有副作用,就应该在声明站点和调用站点添加一个空参数列表。

否则,Scala 具有统一访问原则,因此客户端不需要知道他们是在访问字段还是调用无副作用的方法。

于 2011-08-04T10:46:57.653 回答
10

允许使用不带括号的语法,因此可以这样写:

abstract class X {
  def f: Int
}

class Y extends X {
  val f = 0
}

调用fan的代码X不需要知道它是 aval还是 a def

在调用具有空列表的方法时可以省略括号的原因是允许调用理想情况下没有括号的 Java 方法(但是,因为它们是 Java,所以它们都有括号)。

正如其他人所说,当方法有副作用时使用空参数列表,否则不使用它们。

于 2011-08-04T15:09:36.037 回答
8

是否选择使用括号来指示副作用方法调用是一种风格问题。

顺便说一句,如果你声明一个纯粹的副作用方法 using =,你可能应该显式声明一个Unit返回类型,如下所示:

def a: Unit = println("hello")

请注意,任何类型都可以强制转换为Unit.

如果您不想显式声明返回类型,您可能应该省略=. 然后编译器将推断返回类型Unit,即使最后一个表达式返回不同的东西:

def a() { println("hello") }

上述两种风格都使重构更安全,因为修改方法体永远不会导致编译器推断出不同的返回类型。IMO 声明的这种明确性比调用站点代码样式更重要。

于 2011-08-04T10:54:59.513 回答