aDev aDev - 3 years ago 71
Ruby Question

Why are these outputs different?

These two have different output.

aArray = [[1,2],[2,3],[3,4]]

aArray.each {|subArray| puts subArray}

aArray.each {|subArray| puts "#{subArray}"}

The first each statement prints all the numbers in the array individually while the second statement prints all the subArrays.

What magic does "#" do in this case?

Answer Source

The fact that the example in your question is a nested hash makes not really a difference, therefore I will simplify your question to:

Why do these two examples print different output?

puts [1,2,3]
# 1
# 2
# 3

puts "#{[1,2,3]}"
# [1, 2, 3]

From the documentation of puts:

[...] If called with an array argument, writes each element on a new line. Each given object that isn’t a string or array will be converted by calling its to_s method. [...]

That said:

puts [1,2,3]

is interpreted as:

[1,2,3].each do |element|
  puts element

What is basically the same as:

puts 1
puts 2
puts 3

and prints each element of the array in a line on its own.

Whereas your second example works differently:

puts "#{[1,2,3]}"

In a first step the string interpolation will happen. That means Ruby will evaluate the "#{[1,2,3]}" part. String interpolation is done by calling to_s on the expression within the #{}. Calling [1,2,3].to_s will return the string (not the array) '[1,2,3]'. This string is inserted into the outer string at the place of the interpolation. The result is one string that Ruby prints into one line in a second step. To illustrate each step:

puts "#{[1,2,3]}"
puts "#{[1,2,3].to_s}"
puts "#{'[1,2,3]'}"
puts "[1,2,3]"
# [1,2,3]
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download