32

無名関数内の明示的な return ステートメント (returnキーワードを使用するもの) が、無名関数自体からだけでなく、囲んでいる名前付き関数から戻るのはなぜですか?

たとえば、次のプログラムは型エラーになります。

def foo: String = {
  ((x: Integer) => return x)
  "foo"
}

キーワードを避けることが推奨されていることは知っていますreturnが、明示的および暗黙的な return ステートメントが無名関数で異なるセマンティクスを持つ理由に興味があります。

次の例では、return ステートメントは の実行が終了した後も「存続」しm、プログラムは実行時例外になります。無名関数が囲んでいる関数から返されない場合、そのコードをコンパイルすることはできません。

def main(args: Array[String]) {
  m(3)
}

def m: (Integer => Unit) =
  (x: Integer) => return (y: Integer) => 2
4

2 に答える 2

3

キーワードは(returnクラス) メソッド用に予約されており、関数では使用できません。次のことを簡単にテストできます。

object Foo {
  val bar = (i: Int) => return i + i
}

これは与える

<console>:42: error: return outside method definition
       object Foo { val bar = (i: Int) => return i + i }
                                          ^

ほとんどの場合、メソッドと関数を同じように扱うことができます。これは、関数のapplyメソッドがメソッドを呼び出すように構文的に動作し、いわゆる eta 展開によりメソッドを関数の引数として渡すことができるためです。

この場合、違いが生じます。メソッドとして定義する場合、それは正当です:

object Foo { 
  def bar(i: Int): Int = return i + i
}

要約returnすると、条件付き (早期) リターンを許可するメソッドでのみ使用する必要があります。メソッドと関数の議論については、この投稿を参照してください。

于 2013-07-19T20:49:12.247 に答える