2013年2月18日月曜日

[Scala] 無名関数中での return 文

無名関数の中で return 文を使うと、関数を抜けるのではなく、 無名関数を定義した関数自体を抜けてしまう。
  def main(args:Array[String]) {
    println("main start")
    test();
    println("main finish")
  }
  
  private def test() {
    val f = () => return;
    println("test start")
    f();
    println("test finish")   // 実行されない。
  }

------------------
main start
test start
main finish

test() が f() 呼び出しで return していることがわかる。
関数なのだから なんとなく 無名関数 だけを return しそうな気がするので 気を付ける必要がある。



無名関数内の return が定義元の関数を抜けるため、以下のように、 定義元関数の戻り値と 無名関数内の return の戻す型があっていないとエラーになる。
  private def test2() : Int = {
    val f = () => return;
    return 1;
  }

------------------
type mismatch; found : Unit required: Int
test2() の 戻り値が Int であるのに対して、無名関数内の return が Unit なのでエラーになる。



リターンの階層を深くしてみる。
  def main(args:Array[String]) {
    println("main start")
    test();
    println("main finish")
  }

  private def test() {
    val f = () => return;
    println("test start")
    test2(f);  
    println("test finish")   // 実行されない。
  }
 
  def test2(f: () => Unit) {
    println("test2 start")
    f();   // test2() を抜けてしまう。
    println("test2 finish")  // 実行されない。
  }

------------------
main start
test start
test2 start
main finish

定義元のtest()まで、test()、test2() の2階層を一気に抜けていることがわかる。

0 件のコメント:

コメントを投稿