Variable + string to specify variable

Hi,

Novice question:

I need to assign an item id to one of 3 arrays randomly but can't figure
out how to specify the correct array by combining "arr" and the randomly
generated number...

id = "100"
x = rand(1..3)

arr1 = Array.new
arr2 = Array.new
arr3 = Array.new

selected_array = "#{'arr' + x}" *** Not sure how to do this ****

selected_array.push(id)

Thanks in advance,

Dave Castellano

While you could append the name and eval, that's not really a clean approach. Just use an array of arrays. Or if else...

To expand on what Scott is saying here is some code that gives an example of what he is referring to.

id = 100
x = rand(1…3)
arrays = [Array.new, Array.new, Array.new]
selected_array = arrays[x]
selected_array.push(id)

``

To expand on what Scott is saying here is some code that gives an example of what he is referring to.

id = 100 x = rand(1..3) arrays = [Array.new, Array.new, Array.new] selected_array = arrays[x] selected_array.push(id)

And to make it a bit more flexible, you could do:

arrays = [ Array.new, Array.new, Array.new ]

x = rand(arrays.size)

arrays[x].push(id)

or even:

arrays = [ Array.new, Array.new, Array.new ]

arrays.sample.push(id)

http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-sample

-Rob

I knew there would be a nice simpler Ruby way. I love the second solution, Rob. Below is the updated example.

One tiny note, this is purely a matter of style & taste, spelling it out vs concision, but I thought it might be good for your learning to understand that you could also use:

arrays = [[], [], []]

And, if you wanted a set of arrays that you access by string instead of int:

arrays = {'one' => [], 'two' => [], 'three' => []}
arrays['one'].push(42)
puts arrays['one'][0]

You can simplify the arrays construction, too: (with slight reformatting of the arrays output)

irb2.1.1> arrays = Array.new(3) { Array.new }

#2.1.1 => [[], [], []]

irb2.1.1> 100.times {|id| arrays.sample.push(id) }

#2.1.1 => 100

irb2.1.1> arrays

#2.1.1 => [[0, 2, 6, 8, 9, 11, 14, 16, 17, 18, 22,

        24, 29, 31, 37, 42, 47, 49, 53, 54, 57, 

        58, 60, 68, 69, 73, 75, 79, 80, 81, 83, 

        88, 91, 94, 95, 96], 

       [1, 3, 12, 13, 20, 25, 26, 28, 33, 34,

        38, 39, 43, 44, 48, 50, 52, 59, 63, 65,

        70, 72, 74, 77, 78, 82, 86, 87, 89, 97],

       [4, 5, 7, 10, 15, 19, 21, 23, 27, 30, 

        32, 35, 36, 40, 41, 45, 46, 51, 55, 56,

        61, 62, 64, 66, 67, 71, 76, 84, 85, 90,

        92, 93, 98, 99]]

irb2.1.1> arrays.map(&:size)

#2.1.1 => [36, 30, 34]