我正在学习Ruby,并且在我正在学习的书中有一些关于upto
方法的讨论。我糊涂了。它到底是做什么的?
示例:
grades = [88,99,73,56,87,64]
sum = 0
0.upto(grades.length - 1) do |loop_index|
sum += grades[loop_index]
end
average = sum/grades.length
puts average
答案 0 :(得分:25)
我们试着解释一下:
您定义一个数组
grades = [88,99,73,56,87,64]
并准备一个变量来存储总和:
sum = 0
grades.length
为6(数组中有6个元素),(grades.length - 1)
为5。
0.upto(5)
从0到5循环,loop_index
将为0,然后是1 ......
数组的第一个元素是grades[0]
(数组中的索引以0开头)。
这就是你必须从元素数量中减去1的原因。
0.upto(grades.length - 1) do |loop_index|
将loop_index的值添加到sum。
sum += grades[loop_index]
end
现在你循环每个元素并拥有数组中所有元素的总和。
您可以计算平均值:
average = sum/grades.length
现在将结果写入stdout:
puts average
这是非ruby-like 语法。类似Ruby,你会这样做:
grades = [88,99,73,56,87,64]
sum = 0
grades.each do |value|
sum += value
end
average = sum/grades.length
puts average
基于Marc-Andrés的附录评论:
您也可以使用inject
来避免定义初始总和:
grades = [88,99,73,56,87,64]
sum = grades.inject do |sum, value|
sum + value
end
average = sum / grades.length
puts average
甚至更短:
grades = [88,99,73,56,87,64]
average = grades.inject(:+) / grades.length
puts average
答案 1 :(得分:5)
来自http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_integer.html#upto:
至
int.upto( anInteger ) {| i | block }
迭代
block
,将int
的整数值传递给和 包括anInteger
。5.upto(10) { |i| print i, " " }
产生
5 6 7 8 9 10
答案 2 :(得分:2)
Upto执行从原始数字“upto”传递的每个数字给出一次的块。例如:
1.upto(10) {|x| puts x}
将打印出数字1到10。
答案 3 :(得分:1)
Ruby中只有another way to do a loop/iterator。它表示根据我作为第一个数字,以parens中的数字作为限制,执行此操作 n 次。
答案 4 :(得分:0)
对我来说更像Ruby的替代方案是
require 'descriptive_statistics'
grades=[88,99,73,56,87,64]
sum = grades.sum
average = grades.mean
sd = grades.standard_deviation
当然这取决于你在做什么。
答案 5 :(得分:0)
我的例子就是这样:
1.upto(5) { |i| puts "Countup: #{i}" }
所以你在这里真正做的是说,我想从1到数字5计数,具体是这部分的内容:
1.upto(5)
代码的后半部分(块)只是输出从1到5的遍历计数的迭代。这是您可能期望看到的输出:
Countup: 1
Countup: 2
Countup: 3
Countup: 4
Countup: 5
注意:如果您使用多线,这可以用另一种方式编写:
1.upto(5) do |i|
puts "Countup: #{i}"
end
希望这有帮助。