ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

Thread

t = Thread.new do
 p "start"
 sleep 5
 p "end"
end
p "wait"
t.join
  1. newで生成され”start"を印刷し5秒感スリープする
  2. その間"wait"を印刷し
  3. joinでスレッドの処理が終了するまで待つ

脱出構文

break ループを中断する
next ループの次へ移動
redo 現在のループをやり直す

("a".."z").each_with_index { |i, n| break(i) if n.odd? }
 => "b"
  1. 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
  1. 組み込み変数$! は発生した最後の例外になる
  2. 例外発生後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
  1. 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
  1. p "foo end" は fooよりthrowしているため、実行されずに終わる