プロが教える店舗&オフィスのセキュリティ対策術

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に記述があるかもしれないし、ないかもしれないという
前提でお願いします。

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

A 回答 (1件)

"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
も駄目でしょう。こんな目的で例外を使ってはいけない。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/04/02 21:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!