にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

ハッシュの中の指定されたキーに対する値がセットされているかチェックする

例えば、

h = {:a => 'aaa', :b => 'bbb', :c => 'ccc', :d => nil}

みたいなハッシュがあったとして、:aのキーに対応する値があるかチェックするには

puts 'true' if h[:a]

みたいにそのままif文に突っ込めばいいのだけれど、それが複数になった場合に一つずつh[キー]って書くのはなんかめんどくさいというか見栄えば悪いというか。
なので、

class Hash
  def set? *args
    args.inject(true) {|res, key| res && self.has_key?(key) && self[key]}
  end
end

とか定義してみると、

h.set? :a, :b, :c        #=> true
h.set? :a, :b, :c, :d    #=> false

となって楽しい。
has_key?だと、キーはあるけど値はnilみたいな場合にtrueを出してしまうので、「値がセットされているか確かめたい」という場合には役立つかもしれない。
使う機会もほとんどないかもしれない。