使用ruby阻止内插

时间:2014-11-14 14:58:20

标签: ruby arrays codeblocks string-interpolation

我正在编写一个简单的程序,要求用户输入数组并吐出数组及其平均值。真的很容易,我没有任何问题。

最后我想出了:(在这个例子中,我只是使用随机数组而不是用户输入的代码)

array = [1,2,3]
sum = array.inject(:+)
average = sum.to_f/array.length
puts "The numbers you entered in the array were: #{array.join(" ")}"
puts "The average of those numbers are: #{average}"

输出是预期的并且给了我:

The numbers you entered in the array were: 1 2 3
The averages of those numbers are: 2.0

但是,当我第一次尝试对此进行编码时,我试图通过简单的分配进行实际光滑,并尝试在插值中进行插值。我使用了这段代码:

对于上面代码中我使用的第四行:

puts "The numbers you entered in the array were: #{array.each{|num| print "#{num} "}}" 

输出:

1 2 3 The numbers you entered in the array were: [1, 2, 3]

所以我认为在插值内部的块内进行插值可能存在问题。 然后我运行以下代码来测试内插中的一个块。

puts "The numbers you entered in the array were: #{array.each{|num| print num}}"

输出:

123The numbers you entered in the array were: [1, 2, 3]

任何人都可以向我解释为什么首先在插值中执行proc,打印然后放置。另外,为什么当我从未在数组上调用.inspect时,它将数组放在array.inspect表单中。

1 个答案:

答案 0 :(得分:6)

您想要回答的问题

使用变量插值时,要插入的值将在原始字符串之前解析。

在这种情况下,你的Array.each正在做它并打印出来#34; 1"然后" 2"最后" 3"。它返回原始数组[1,2,3]

output> 123 # note new line because we used print

现在您的插值已解决,其余的放置结束并使用返回的值[1,2,3]并打印:

output> The numbers you entered in the array were: [1, 2, 3]\n

获得最终输出:

output> 123The numbers you entered in the array were: [1, 2, 3]\n

每个人都想回答的问题:)

http://www.ruby-doc.org/core-2.1.4/Array.html#method-i-each

使用块调用Array.each时,返回为self。

这是"坏"在你的情况下,因为你不想要自我归还。它将始终返回相同的东西,即原始数组。

puts "The numbers you entered in the array were: #{array.each{|num| num*2}}"
The numbers you entered in the array were: [1, 2, 3] # WAT?

正如Sergio Tulentsev所说,使用.map和.join

puts "The numbers you entered in the array were: #{array.map{|num| num*2}.join(' ')}"
The numbers you entered in the array were: 2 4 6