这两种方法定义有什么区别?

时间:2012-10-14 17:47:36

标签: scala

  

可能重复:
  Why to use empty parentheses in Scala if we can just use no parentheses to define a function which does not need any arguments?

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

第一个是

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

第二个是

class Foo {
  def bar = "bar"
}

虽然两者基本相同,但它们需要以不同方式调用,第一个就像这样

someFoo.bar()

和第二个

someFoo.bar

为什么我要使用一个而另一个又有什么根本区别?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

  1. 他们都不需要用parantheses调用。然而,def bar = "bar"需要在没有parantheses的情况下被调用,因为这些parantheses将被暗示应用于它的结果,因此在这种情况下,调用bar()将具有与"bar"()相同的效果。 / p>

  2. 这只是一个惯例问题。在我的实践中,我见过两个:

    • 标准(用于标准库和大多数第三方库)。当方法不产生副作用时,丢弃parantheses。 “纯”,即除了不引起任何副作用外,也不依赖于状态,但不是必需的。根据这个惯例,你的第二个例子是正确的。
    • Scalaz。只要方法没有参数,就丢弃parantheses,即该方法可能产生副作用。例如,他们在没有括号的情况下对方法print进行了操作。
  3. Bozhidar提出了另一个惯例,但老实说,这是我第一次接触它。