質問: YAML.load_file("revel.yml") revel.each do |a,b| if b.instance_of?(Hash) b.each do|c,d| if d.instance_of?(Hash) d.each do |e,f| if f.instance_of?(Hash) f.each do|g,h| p "#{a}の#{c}の#{e}の#{g}は#{h}です" end else p "#{a}の#{c}の#{e}は#{f}です" end end else p "#{a}の#{c}は#{d}です" end end else p "#{a}は#{b}です" end end ``` 上記ご指導のほどよろしくお願いいたします.
回答: ``` 僕はrubyが苦手でして...生理的に受け付けない言語といいますか。 なので具体的なコードは書けませんが、デザインパターンからアドバイスだけします。 ``` 構造はComposite(コンポジット)パターンと言います。 簡単にいうと、コンポジットパターンとはディレクトリとファイルの構造のことです。 コンポジットパターンに適用できる各要素にアクセスするために使えるパターンが2つあります。 各要素にアクセスする手段を要素自身に任せるのがvisitor(ビジター)パターンです。 考え方としては、ルート要素にファンクタを渡します。 要素は自身にファンクタを適用し、自身の子供にファンクタをパスします。 子供は子供自身にファンクタを適用し、子供がいればその子供にファンクタをパスします。 この再帰構造を使えば全要素の値がファンクタに入る=参照できる、という寸法です。 そのためのメソッドを要素に共通で1つだけ持ちます。 Visitorパターンはちょっと分かりづらいですけどね...(良い説明サイトがないといつも感じる。) Iteratorパターンにするという方法もあります。 Iteratorパターンは、自身の要素を並べるパターンのことです。 応用して、自分自身と、自分自身の子供を返すということを繰り返してネストされた構造を1層構造に見せることができれば全要素にアクセスできるようになります。