2011-09-29 17 views
29

可能な重複なし:Scalaで
Functions vs methods in Scala
括弧付き関数の差

What is the difference between def foo = {} and def foo() = {} in Scala?

我々は

def foo():Unit = println ("hello") 

又は

を定義することができ
def foo:Unit = println ("hello") 

私はそれらが同じではないが、違いは何で、いつ使うべきか知っていますか?

これまでに回答があった場合は、そのリンク先を教えてください。

+0

@MatthewFarwell私は、リンクされた質問は、括弧の質問に答えるとは思わない。 –

+0

また、http://stackoverflow.com/questions/6939908/scala-functions-with-no-argumentsを参照してください。 –

+1

質問http://stackoverflow.com/questions/7409502/what-is-the-difference-between-def -foo-and-def-foo-in-scalaはまったく同じです。 – paradigmatic

答えて

37

0アライリティのScalaメソッドは、かっこの有無にかかわらず定義できます()。これは、後でvalとして実装することができるものとは対照的に、メソッドに何らかの副作用(標準出力への出力やデータの破棄など)があることをユーザに知らせるために使用されます。

Programming in Scalaを参照してください:

このようなパラメータなしの方法はScalaでかなり共通しています。対照的に、def height():Intなどの空のかっこで定義されたメソッドは空のメソッドと呼ばれます。パラメータがなくてもメソッドが変更可能な状態にアクセスする場合は、そのオブジェクトのフィールドを読み取ることによってのみパラメータのないメソッドを使用することをお勧めします(特に、変更可能な状態は変更されません)。

この規則はオフのまま、すなわち、パラメータを取らず、パラメータのない方法として、副作用がないメソッドを定義するためにScalaでスタイルを奨励され、要約すると均一なアクセスの原則[...]

をサポートしています空のかっこ。一方、かっこなしの副作用を持つメソッドを決して定義するべきではありません。そのメソッドの呼び出しはフィールド選択のように見えるからです。

+0

"副作用"の定義を拡張できますか? – Jus12

+2

@ Jus12これはまったく別の質問で、Wikipediaを掘り下げたり見たりすることができます - http://ja.wikipedia.org/wiki/Side_effect_(computer_science) –