みなさん、以下の結果について、予想できますか?
筆者はこれにハマってしまいました
string = ''
hashes = []
%w(a b c).each do |word|
string << word
hashes.push(string: string)
end
p hashes
筆者は以下のような出力を考えていました。。。
hashes = [
{string: "a"},
{string: "ab"},
{string: "abc"}
]
しかし、実際には以下の出力となります。
hashes = [
{string: "abc"},
{string: "abc"},
{string: "abc"}
]
これを想定通りの出力にするならこうです。
string = ''
hashes = []
%w("a b c").each do |word|
string += word
hashes.push(string: string)
end
p hashes
ポイントは文字列連結で、 <<
ではなく +
を使っている部分ですが、<<
では同一のオブジェクトに対して中身を書き換えているのに対して、+
では別のオブジェクトを生成するためです。(Javaの文字列連結みたいなものですね)