我正在编写一个简单的程序,要求用户输入数组并吐出数组及其平均值。真的很容易,我没有任何问题。
最后我想出了:(在这个例子中,我只是使用随机数组而不是用户输入的代码)
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表单中。
答案 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