没有参数的Scala方法

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具有统一访问原则,因此客户端无需知道他们是在访问字段还是调用无副作用的方法.

  • 它是否返回无关紧要. (4认同)
  • @codecool,副作用函数是那些修改内部状态的子程序。如果没有适当的上下文,“副作用”这个词可能会产生误导。有时这种效果正是您想要并期望发生的。 (2认同)

Dan*_*ral 10

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

abstract class X {
  def f: Int
}

class Y extends X {
  val f = 0
}
Run Code Online (Sandbox Code Playgroud)

调用代码fX并不需要知道,如果它是一个val或一个def.

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

正如其他人所说,当方法具有副作用时,存在使用空参数列表的惯例,否则将其关闭.


Ben*_*mes 7

无论您选择使用括号来表示副作用方法调用,都是一种风格问题.

顺便说一下,如果你声明一个纯粹的副作用方法=,你应该显式声明一个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这种声明的明确性比呼叫站点代码风格更重要.