这两个有不同的输出。
aArray = [[1,2],[2,3],[3,4]]
aArray.each {|subArray| puts subArray}
aArray.each {|subArray| puts "#{subArray}"}
第一个语句分别打印数组中的所有数字,而第二个语句打印所有的subArrays。
有什么魔力和#34;#"在这种情况下呢?
答案 0 :(得分:5)
您的问题中的示例是嵌套哈希的事实并没有真正区别,因此我会将您的问题简化为:
为什么这两个例子打印出不同的输出?
puts [1,2,3]
# 1
# 2
# 3
puts "#{[1,2,3]}"
# [1, 2, 3]
来自puts
的文档:
[...]如果使用数组参数调用,则将每个元素写入新行。每个不是字符串或数组的给定对象将通过调用其to_s方法进行转换。 [...]
那说:
puts [1,2,3]
被解释为:
[1,2,3].each do |element|
puts element
end
基本相同:
puts 1
puts 2
puts 3
并将数组中的每个元素单独打印出来。
而你的第二个例子的工作方式不同:
puts "#{[1,2,3]}"
在第一步中,将进行字符串插值。这意味着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]
答案 1 :(得分:3)
默认情况下,puts
会在自己的行上输出数组的每个元素。
然而,
puts "#{subArray}"
相当于:
puts subArray.to_s
这个converts数组到字符串表示自身;所以保留方括号。
答案 2 :(得分:0)
在Ruby中, puts 方法用于在一行中输出数组的每个元素。
#{}文字是用于在双引号字符串内插值的运算符。从实际的角度来看,文本中的表达式被计算,然后整个#{}表达式(包括运算符和它包含的表达式)将在原位替换为结果。
答案 3 :(得分:0)
不同之处在于第一个是实际变量,第二个是字符串中的变量。 #{}
使得您可以将变量直接放入字符串中,而无需使用.+()
或+
。确保在使用#{}
时使用双引号,因为这表示要将变量放入ruby,如果使用单引号,它实际上会使用变量名称打印#{}
。
例如:
name = "Origami"
puts '#{name}'
puts "#{name}"
第一个会打印#{name}
,但第二个会打印:Origami