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: Inttest2() の 戻り値が 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 件のコメント:
コメントを投稿