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の問題 - 中継地点
あと他の言語で調べるのは面倒くさくなったのでやってない。