【问题标题】:What is the difference between these two method definitions? [duplicate]这两种方法定义有什么区别? [复制]
【发布时间】:2012-10-14 17:47:35
【问题描述】:

可能重复:
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

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

【问题讨论】:

  • 我认为这是我在 SO 上看到的 scala 标签最常见的问题之一 :)
  • 它们需要以不同的方式调用实际上,没有什么能阻止你调用没有大括号的方法定义的括号:def foo() {}; foo(反之亦然)

标签: scala


【解决方案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

【讨论】:

  • 你的意思不是“定义”而不是“调用”吗?
【解决方案2】:
  1. 它们都不需要用括号调用。然而def bar = "bar" 需要在没有括号的情况下被调用,因为括号将被暗示应用于它的结果,因此在这种情况下调用bar() 将具有与"bar"() 相同的效果。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2016-09-26
    • 1970-01-01
    • 2013-09-08
    • 2019-03-31
    相关资源
    最近更新 更多