みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2次元Hashのkeyチェック方法

yamlで記述した設定ファイルを読み込んで、
設定値があれば、変数にセットし、
なければdefault値を使うプログラムを書いています。

こんな感じです。
[設定ファイル(yaml)]
top_dir :
 linux : /home/user
 windows : C:/Documents

[ruby]
conf = YAML.load_file(filename)
p conf #=> {"top_dir"=>{"linux"=>"/home/user", "windows"=>"C:/Documents"}}

str = "/root"
str = conf['top_dir']['linux'] unless conf['top_dir'].nil? or conf['top_dir']['linux'].nil?

最後の2次元Hashのキーをチェックして、変数にセットしている
部分ですが、もっと短く書けないでしょうか?
特にconfが3回も出てくるところに無駄を感じています。

ちなみに、Hashのキー'top_dir'と'linux'は
yamlに記述があるかもしれないし、ないかもしれないという
前提でお願いします。

達人の方、ご教授お願いします。

投稿日時 - 2009-03-23 21:02:20

QNo.4821643

暇なときに回答ください

質問者が選んだベストアンサー

"top_dir" が無い場合、"linux" が無い場合をそれぞれ考慮するとなると、confと書くのは最低二回は要るでしょう。
nil? という判断条件をひっくり返すことで、conf["top_dir"]["linux"]を一回に出来ます。~.nil? が出てきたら見直した方が良いでしょうね。

str = conf["top_dir"] && conf["top_dir"]["linux"] || "/root"

conf一回で済ませるパズル的解法としては、nilの添え字参照がエラーにならないようにする。
def nil.[](x)
end
str = conf["top_dir"]["linux"] || "/root"
パズルの回答以外ではやめた方が良いでしょう。デバッグがしにくくなります。

begin
str = conf["top_dir"]["linux"] || "/root"
rescue
str = "/root"
end
も駄目でしょう。こんな目的で例外を使ってはいけない。

投稿日時 - 2009-03-24 03:31:29

お礼

ありがとうございました。参考になりました。

投稿日時 - 2009-04-02 21:28:31

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問