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 件のコメント:
コメントを投稿