为什么这些输出不同?

时间:2017-09-29 16:02:16

标签: ruby

这两个有不同的输出。

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

aArray.each {|subArray| puts subArray}

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

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

有什么魔力和#34;#"在这种情况下呢?

4 个答案:

答案 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