Scala 这两种方法定义之间的区别是什么?

Scala 这两种方法定义之间的区别是什么?,scala,Scala,可能重复: 假设我们有一个类Foo,它有一个方法bar(它不接受任何参数并返回字符串“bar”)。有两种方法可以实现bar 第一个是 class Foo { def bar() = "bar" } 第二个是 class Foo { def bar = "bar" } 虽然两者的作用基本相同,但它们的名称需要有所不同,第一个是这样的 someFoo.bar() 第二个呢 someFoo.bar 为什么我应该使用一种方法而不是另一种方法?根本的区别是什么?定义一个没有括号的参数的方

可能重复:

假设我们有一个类
Foo
,它有一个方法
bar
(它不接受任何参数并返回字符串
“bar”
)。有两种方法可以实现bar

第一个是

class Foo {
  def bar() = "bar"
}
第二个是

class Foo {
  def bar = "bar"
}
虽然两者的作用基本相同,但它们的名称需要有所不同,第一个是这样的

someFoo.bar()
第二个呢

someFoo.bar

为什么我应该使用一种方法而不是另一种方法?根本的区别是什么?

定义一个没有括号的参数的方法意味着该方法是纯的(它没有副作用,也不依赖于程序的状态)。这些方法不能用括号调用:

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
  • 他们两个都不需要被称为妄想狂。然而,调用
    def bar=“bar”
    时需要不带偏执,因为偏执将被暗示应用于它的结果,因此在这种情况下,调用
    bar()
    将具有与
    “bar”(
    相同的效果

  • 这只是惯例问题。在我的实践中,我看到了两个:

    • 标准(用于标准库和大多数第三方库)。当这种方法没有副作用时,不要妄想。“纯”,即除了不会引起任何副作用外,也不取决于状态,但这不是一项要求。根据这个惯例,你的第二个例子是正确的
    • 斯卡拉兹。每当方法没有参数时,即该方法可能产生副作用时,请删除偏执。例如,他们在没有括号的情况下推销一种方法
      print

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

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