Thread
t = Thread.new do p "start" sleep 5 p "end" end p "wait" t.join
- newで生成され”start"を印刷し5秒感スリープする
- その間"wait"を印刷し
- joinでスレッドの処理が終了するまで待つ
脱出構文
break ループを中断する next ループの次へ移動 redo 現在のループをやり直す
例
("a".."z").each_with_index { |i, n| break(i) if n.odd? } => "b"
- breakに引数を渡すとその値を戻り値にする
例外処理
raise 例外発生 raise ArgumentError, "引数が不正” raise ArgumentError.new, "引数が不正" err = ArgumentError.new("引数不正") raise err raise "エラー" # RuntimeErrorとなる
begin rescue
他の言語のTry/Catchに該当
begin 1 / 0 p 1 rescue #例外が発生した場合実行 p "error" else #例外が発生しなかった場合実行 p "succes" ensure #例外に関係なく必ず実行される p "allways" end
例外の種類
SyntaxError : 文法えらい SignalException : 補足していないシグナルをうけた場合 ArgumentError : 引数が合わない場合 RuntimeError : 実行中エラー NameError : 未定義のローカル変数や定義を参照した場合 NoMethodError : 未定義メソッドが呼ばれた時 ZeroDivisionError : 0で除算した場合
例外を指定したrescue処理
begin 1/0 rescue ZeroDivisionError => e p e.backtrace end
例外の再発生
begin 1/0 rescure ZeroDivisionError p $!.class #ZeroDivisionError raise #ZeroDivisionError end
- 組み込み変数$! は発生した最後の例外になる
- 例外発生後raiseをもう一度実行するとRuntimeErrorでは無く最後の例外を再度実行出来る
retry
例外発生後自己解決し、再度実行する場合
a = 0 begin p "start" b = 1 / a p "retry" rescue ZeroDivisionError p "error" a += 1 retry ensure p "last" p b end
- retryでbeginの最初から再実行されている
catch/throw
ブロック内でthrowが呼ばれると引数のcatchを探し
ブロックを抜ける
begin def foo p "foo" throw :exit end p "start" catch(:exit){ foo p "foo end" } p "end" end
- p "foo end" は fooよりthrowしているため、実行されずに終わる