为什么这些输出不同?

aDe*_*Dev 2 ruby

这两个有不同的输出.

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

aArray.each {|subArray| puts subArray}

aArray.each {|subArray| puts "#{subArray}"}
Run Code Online (Sandbox Code Playgroud)

第一个语句分别打印数组中的所有数字,而第二个语句打印所有的subArrays.

在这种情况下,"#"做了什么魔术?

spi*_*ann 5

您的问题中的示例是嵌套哈希的事实并没有真正的区别,因此我将您的问题简化为:

为什么这两个例子打印出不同的输出?

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

puts "#{[1,2,3]}"
# [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

来自以下文件puts:

[...]如果使用数组参数调用,则将每个元素写入新行.每个不是字符串或数组的给定对象将通过调用其to_s方法进行转换.[...]

那说:

puts [1,2,3]
Run Code Online (Sandbox Code Playgroud)

被解释为:

[1,2,3].each do |element|
  puts element
end
Run Code Online (Sandbox Code Playgroud)

基本相同的是:

puts 1
puts 2
puts 3
Run Code Online (Sandbox Code Playgroud)

并将数组中的每个元素单独打印出来.

而您的第二个示例的工作方式不同:

puts "#{[1,2,3]}"
Run Code Online (Sandbox Code Playgroud)

在第一步中,将发生字符串插值.这意味着Ruby将评估该"#{[1,2,3]}"部分.字符串插值是通过调用to_s.中的表达式完成的#{}.调用[1,2,3].to_s将返回字符串(不是数组)'[1,2,3]'.该字符串插入到插值位置的外部字符串中.结果是Ruby在第二步中打印成一行的一个字符串.为了说明每一步:

puts "#{[1,2,3]}"
puts "#{[1,2,3].to_s}"
puts "#{'[1,2,3]'}"
puts "[1,2,3]"
# [1,2,3]
Run Code Online (Sandbox Code Playgroud)