a = Array.new(3,[])
a[1][0] = 5
a => [[5], [5], [5]]
I thought this doesn’t make sense!
isn’t it should a => [[], [5], []]
or this’s sort of Ruby’s feature ?
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
Use this instead:
With your code the same object is used for the value of each entry; once you mutate one of the references you see all others change. With the above you instead invoke the block each time a new value is needed, which returns a new array each time.
This is similar in nature to the new user question about why the following does not work as expected:
In the above, string interpolation occurs before the
gsubmethod is ever called, so it cannot use the then-current value of$1in your string. Similarly, in your question you create an object and pass it toArray.newbefore Ruby starts creating array slots. Yes, the runtime could calldupon the item by default…but that would be potentially disastrous and slow. Hence you get the block form to determine on your own how to create the initial values.