Enumerable#any?, #all?2010/02/12

http://shinh.skr.jp/m/?date=20100211#p01

後段はRubyっぽい仮想コードだと思いますが、 これって、Enumerable#any? とか Enumerable#all? を使って

return if array.all?{|c| c.fuga?}

じゃあ駄目なんですかね?

Hash#fetch2010/02/04

例外が起きるか否か

んー、Hash#[] が例外を投げるかどうかは、その言語のデザイナが「どちらのユースケースが頻出パターンであるか」を判断した結果だと思います。

Rubyにも Hash#fetch という長いメソッドが用意されていて、このメソッドのデフォルト動作はキーが存在しなければIndexError例外が発生する Hash#[] です。

これは、Matzが、例外が起きて欲しい場合とそうでない場合を量りにかけて、後者の方が多いと判断した結果じゃないのかなあ。

Temfile2010/01/14

Tempfile

クラスの継承リスト: Tempfile < File  < IO  < Enumerable  < File::Constants  < Object  < Kernel

であるにも関わらず、

irb(main):001:0> tempfile = Tempfile.new('basename')
=> #<File:xxxx>
irb(main):002:0> tempfile.class
=> Tempfile
irb(main):003:0> tempfile.kind_of? IO
=> false
irb(main):004:0> tempfile.kind_of? File
=> false

になるのはどうして? 教えて偉いひと。

方法は判るけど、理由が判らない……。

Mechanizeでファイルを送信しようとした時に、Tempfileのインスタンスを渡すと どうしても Content-Type が 'multipart/form-data' にならないなあと思ったら、 これが原因だった。

具体的には、 WWW::Mechanize#post で、クエリの value に is_a?(IO) を訊いている。 ここで、value が Tempfile だと false が返って 'application/x-www-form-urlencoded' で送信されてしまう。

とりあえず、急ぎだったので、

--       if v.is_a?(IO)
++       if v.is_a?(IO) || v.is_a?(Tempfile)

な感じで逃げる。

tmpdir2010/01/12

備忘録として

ruby 1.8.5 の tmpdir には mktmpdir がない

Dir.mktmpdir

というか、1.8.5はもう捨ててください。

なんで、RHELの公式リポジトリはバージョン上らんのじゃろ?

(追記)

sqlite3-ruby 1.2.5 ももはや ruby 1.8.5はサポート外(インストール前チェックではじかれる) とりあえず、1.2.1を入れた。1.8.5は……(ry

ZenTest 4.2.12010/01/05

会社の作業用マシンが入れかわったので、いろいろ環境を修復中な訳ですが、なんとなくZenTestも最新版に上げてみた。

欲しいのは主にautotestだけですが……。

Rspecサポート

いつの間にか正式にサポートされていたようです。

export RSPEC=true

としておくと (カレント)/spec/ の下のファイルが検索対象になって、Rspecでテストが実行されます。

しかし、これを .autotest に書く方法が判りません。

このへん の記述を見ると

Autotest.add_discovery do
  "rspec"
end

ぐらいに書けば良さげなんだけど、上手くいかない。 複数でいじるプロジェクトではあまり環境変数は使いたくないので、相変らず add_hook を書くはめに。

なにが不味いんだろう。