なんで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