Humanity

Edit the world by your favorite way

Re: return と ensure 節

return と ensure 節 - #!/usr/bin/env japanese - Teq.g
Rubyではensure(finally的なもの?)でreturnできるらしい。
というか他の言語はfinallyでreturnできるのか気になったので調べてみた。

Vimスクリプト

なんで最初がこの言語なんだよ。

function! s:foo()
    try
        return 1
    finally
        return 0
    endtry
endfunction

echo s:foo()

0と表示された。
やっぱりRubyと同じくfinallyのreturnが返るらしい。

Java

Vimスクリプトの次にC++Perlを考えたけどそもそもfinallyがなかった。RAIIめんどいしfinallyでいいじゃん
なのでJava
よく知らないので何か間違ってるかも。
というか最初ファイル名とクラス名が違うとダメなことを忘れていてハマった。

import java.io.*;

class Test {
    public static void main(String args[]) {
        System.out.println(Foo.foo());
    }
}

class Foo {
    static int foo() {
        try {
            return 1;
        } finally {
            return 0;
        }
    }
}

結果はやっぱり0。

おまけ

でもこれ本来のfinallyの用途と違うし
やっぱりやっちゃいけないんだろうなぁと思ったら案外そうらしい。
以下finallyでreturnするとバグが分かりにくくなる例。

public int method () throws Throwable {
    try {
        if (true) {
            throw new Exception("hoge");
        }
    } finally {
        return 1;
    }
}

methodは正常終了し1が返されます。

finally句におけるreturnの問題 - 中継地点

あと他の言語で調べるのは面倒くさくなったのでやってない。