Ruby中的'upto'方法

时间:2012-03-15 20:59:22

标签: ruby

我正在学习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

6 个答案:

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

希望这有帮助。