桐山です.

# 最近全然読んでないのにポストします ;p

ハッシュを要素とするネストした配列で,任意のネストした要素に
配列を代入したいのですが,eval を使って代入する際に配列自体
をリテラルにするところで固まってしまいました.以下に例を示し
ます.

region = [2, 1, 3]

a = [{:a => 0},
     {:a => 1},
     {:a => 2,
      :b =>
      [
      {:a => 20},
      {:a => 21,
       :b =>
       [
          {:a => 210},
          {:a => 211},
          {:a => 212},
          {:a => 213, :b => 2133}
        ],
       :a => 22}
    ]}
]

b = [{:a => 2133, :b => 21331}]

s = ""
region.each {|j| s += "[#{j}][:b]"}
eval "a#{s} = #{b}"


この例では,region にしたがって,a の 2 番目の :b の 1 番目
の :b の 3 番目の :b の要素を,配列 b に付け替えることをやろ
うとしてます.配列の添字は region から生成できる(上の例では
s に求まる)のですが,付け替えたい配列(上の例では b)自体をリ
テラルにできないため eval で「代入」できません.上の例では
eval "a#{s} = #{b}" ってやってますが,当然これは

% ruby ./obj2str.rb
./obj2str.rb:27: undefined local variable or method `a2133b21331' for main:Object (NameError)
%

と言われます.実際には eval "a#{s} = [{:a => 2133, :b => 21331}]"
となって欲しいのですが,何とかなんないでしょうか?

% ruby -v
ruby 1.8.2 (2004-07-29) [i386-freebsd5]
% uname -r
5.4-RELEASE-p1
% 

です.