RubyのArrayについて質問があります。
下記の失敗例(コード)の要素が全て{:cat=>"Nuko"}で埋まる理由は、1つのHashインスタンスへの参照がaryのすべての要素に代入されているからだと思います。つまり、Hash.newは一度しか行われていません。
成功例の方は、3回Hash,newが実行され、各Hashインスタンスがaryの要素に代入されているため、個別の要素ごとに値を代入できます。
ruby
1#失敗 2ary = Array.new(3, Hash.new) 3ary[0][:cat] = "Nuko" 4ary 5# => [{:cat=>"Nuko"}, {:cat=>"Nuko"}, {:cat=>"Nuko"}]
ruby
1#成功 2ary = Array.new(3){ Hash.new } 3ary[0][:cat] = "Nuko" 4ary 5# => [{:cat=>"Nuko"}, {}, {}]
ですが、失敗例のコンストラクタにbooleanのtrueを渡したところを、成功例と同じ現象が起きました。どうやら参照がわたっているわけではないようです。
ruby
1#失敗例と同じ生成 2ary = Array.new(3, true) 3ary[1] = false 4ary 5# => [true, false, true]
もしかしたらrubyはJavaScriptやPythonのように全てがオブジェクトでできているわけでなく、Javaのようにプリミティブ値があるのかと思いました。
どうしてArray.new(3, Hash.new)
だと1つのHashインスタンスしか代入されないのに、Array.new(3, true)
だと3つのtrueが代入されるのでしょうか?
ご回答、よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/19 07:29