なんでretryがブロックかrescue節の中でしか使えないんだろう。

RPG*1でよくありそうな「2D6を振る。ただし12の場合は振りなおし」という行動をメソッド化する場合、だいたい以下のようになると思います。

def roll
  begin
    dice = (1+rand(6))+(1+rand(6))
    raise if dice == 12
  rescue
    retry
  end
  
  return dice
end

ですが、このraiseは本質的でないのでできれば省略して、

def roll
  dice = (1+rand(6))+(1+rand(6))
  retry if dice == 12
  
  return dice
end

と書けると嬉しいところ。
なんでメソッドのbodyでretryできないんだろう?

def roll
  dice = (1+rand(6))+(1+rand(6))
  raise if dice == 12 rescue retry
  
  return dice
end

最初にこんな感じで試してみましたが無限ループになりました。
retryするのがその行だけだから、raiseを発生させまくってるのかな。多分。



ちなみに、retryを使わない以下のような書き方は、

def roll
  begin
    dice = (1+rand(6))+(1+rand(6))
  end until dice != 12
  
  return dice
end

「12以外が出るまで2D6を振る」というあまり一般的でない表記になってしまうのでNG。

*1:何も修飾しない場合はテーブルトークRPGのこと。コンピュータ使うのはCRPG