2

可能重复:
如果我们可以不使用括号来定义不需要任何参数的函数,为什么要在 Scala 中使用空括号?

考虑我们有一个Foo带有方法的类bar(它不接受任何参数并返回字符串"bar")。实现bar有两种方式

第一个是

class Foo {
  def bar() = "bar"
}

第二个是

class Foo {
  def bar = "bar"
}

虽然两者的作用基本相同,但它们的名称需要不同,第一个像这样

someFoo.bar()

第二个

someFoo.bar

为什么我应该使用一个而不是另一个,根本区别是什么?

4

2 回答 2

1

定义一个不带括号的参数的方法意味着该方法是的(它没有副作用并且不依赖于程序的状态)。此类方法不能用括号调用:

class Square(val side: Int) {
  def area = side * side
}

s = new Square(10);
s.area //ok
s.area() //compilation error

调用不带括号的参数的方法意味着该方法有一些副作用和返回类型Unit。用空括号定义的方法可以在有或没有它们的情况下调用。

class Foo {
  def bar(): Unit = println("bar")
}

f = new Foo();
f.bar; //ok, bad style
f.bar(); // good
于 2012-10-14T17:55:06.277 回答
1
  1. 它们都不需要用括号调用。Yetdef bar = "bar"需要在没有括号的情况下被调用,因为括号将被暗示应用于它的结果,因此在这种情况下调用bar()将具有与 . 相同的效果"bar"()

  2. 这只是约定俗成的问题。在我的实践中,我看到了两个:

    • 标准(用于标准库和大多数第 3 方库)。当该方法没有产生副作用时,放弃括号。“纯”,即除了不引起任何副作用也不取决于状态,但是不是必需的。根据这一约定,您的第二个示例将是正确的示例。
    • 斯卡拉兹。只要方法没有参数,就去掉括号,即该方法可能会产生副作用。例如,他们拉皮条print不带括号的方法。

Bozhidar 提出了另一个约定,但老实说,这是我第一次接触它。

于 2012-10-14T18:35:38.683 回答