2012-10-01から1ヶ月間の記事一覧

CRubyで末尾最適化を使った再帰

Schemeなんかと違って、言語としてのRubyは末尾最適化(Tail Call Optimization)の実装は必須ではないけど、処理系としてのCRubyは2.0.0からオプション扱いで入っている、という話。2012年の6月ごろにはMatzさんはTCOをデフォルトにするという考えもあった…

find.rbにみるRubyのthrow/catchの大域脱出の例

Rubyのthrow/catchの大域脱出って、あまり見かけない気がしているけど、どういうときに使うのかなとぼんやり思っていたら、標準添付の lib/find.rbになるほどと思う例が見つかった。 # # find.rb: the Find module for processing all files under a given d…

Rubyで自前の例外クラスを作るときExceptionではなくStandardErrorを継承する理由

Rubyの例外について少し調べたので、まとめてみる。多くのモダンな言語同様にRubyでは例外処理機構が組み込まれている。 ファイルを開こうと思ったらファイルが存在しなかった ネットワーク先のサーバが反応しなくてタイムアウトした 定義されていない(存在…

method_missing の中で gsub 呼んだら無限ループに

method_missing って自分で試したことがなかったので、Eloquent Rubyの21章を参考に、オレオレ定義を書いてみた。Eloquent Rubyのサンプルは英語で単語間の距離を発音の近さで判定するSoundexというものを使っていたけど、全く同じでもつまらないし、日本人…

Rubyではメソッドの中で定数を変更できないのはflymakeもお見通し

Rubyではメソッドの中で定数を変更できない(リフレクション系のメソッドを使わない限り、という意味で)。これは動的にエラーや例外となっているのではなくて、パーズした段階で吐き出されるエラーのようだ。 MyConst = 2 def change_const MyConst = 3 end…

RubyのDateTimeとTimeはどちらを使うべきか

TimeはもともとPOSIXのtime_t型のラッパーで、内部的には1970年1月1日を起点とする秒数を保持している。WikipediaによるUnix timeの記述を見ると、time_tは、なんと初期のUnixでは32ビット整数であったものの、60Hzのクロックに同期してカウントアップしてい…