パンプキンスパイスラテ

IT系のことが多めの日記帳です

Rubyで二次元ハッシュの存在確認

自分メモ。
■hash['hogehoge']['fugafuga']の存在確認をする。
defined?を使う。

if defined? hash['hogehoge']['fugafuga'] then
  puts "あり"
else
  puts "なし"
end

三項演算子を使って書くならこう。

puts defined?(hash['hogehoge']['fugafuga']) ? "あり" : "なし"

defined?()のように三項演算子では()が必要。
勘違いしていました。

コメントより
defined?は「式が定義されていなければ偽」なので、エラーなく式が実行できる状態であればキーが無くても偽以外になります。

http://d.hatena.ne.jp/takeru-c/20090519/1242752019#c106600985
>> hash = { 'hogehoge' => {} }
=> {"hogehoge"=>{}}
>> defined?(hash['hogehoge']['fugafuga']) ? "Y" : "N"
=> "Y"

うわーい、だめじゃーん。
というわけで、詳しくはコメントを参照してもらうとして、簡単にチェック(nilかどうかを判定)するなら下記のとおり。

>> h = Hash.new({})
=> {}
>> h['hogehoge']['fugafuga']
=> nil

デフォルト値を指定してあげるといいらしい。