2

重複の可能性:
引数を必要としない関数を定義するために括弧を使用できないのに、Scalaで空の括弧を使用するのはなぜですか?

Fooメソッドを持つクラスがあると考えてくださいbar(引数をとらず、文字列を返します"bar")。バーを実装する方法は2つあります

最初のものは

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

2つ目は

class Foo {
  def bar = "bar"
}

どちらも基本的に同じですが、別の方法で呼び出す必要があります。最初の例は次のとおりです。

someFoo.bar()

そして2番目のもの

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. それらのどちらも、paranthesesで呼び出す必要はありません。ただしdef bar = "bar"、結果に括弧が適用されることが暗示されるため、括弧なしで呼び出す必要があります。したがって、この場合、呼び出しbar()はと同じ効果があり"bar"()ます。

  2. それは慣例の問題です。私の練習では、2つ見ました。

    • 標準(標準ライブラリおよびほとんどのサードパーティライブラリで使用されます)。メソッドで副作用が発生しない場合は、括弧を削除してください。「純粋」であること、つまり副作用を引き起こさないことに加えて、状態に依存しないことも要件ではありません。この規則によれば、2番目の例が正しい例になります。
    • スカラズ。メソッドに引数がない場合、つまりメソッドが副作用を引き起こす可能性がある場合は常に、括弧を削除してください。たとえば、print括弧なしでメソッドをポン引きします。

ボジダールは別の大会を発表しましたが、正直なところ、私がそれに触れたのは初めてです。

于 2012-10-14T18:35:38.683 に答える