Ruby 更新计数器时遍历哈希

Ruby 更新计数器时遍历哈希,ruby,Ruby,我有一个杂烩: students = { class1: 11, class2: 24, class3: 38, class4: 62 } 我希望有四行输出: 1) 11 2) 35 #11 + 24 3) 73 #35 + 38 4) 135 #73 + 62 它遍历每个元素,并向计数器添加一个值,同时打印每个迭代。我需要像这样的东西: students.each do |key, value| value + counter = total puts

我有一个杂烩:

students = {
  class1: 11,
  class2: 24,
  class3: 38,
  class4: 62
}
我希望有四行输出:

1) 11  
2) 35 #11 + 24  
3) 73 #35 + 38  
4) 135 #73 + 62
它遍历每个元素,并向计数器添加一个值,同时打印每个迭代。我需要像这样的东西:

students.each do |key, value|
  value + counter = total
  puts total
end  

但是我不知道怎么做。请告诉我。

事实上,你已经非常接近了。您需要在块外定义
total
变量,只需使用

total=0
这将使它在所有迭代中保持不变。那你只需要换个零钱

students.each do |key, value|
  total=total+value
  puts total
end
它会做你想做的事


切换
value+counter=total
的顺序很重要,因为赋值(通过
=
)总是赋值给左边的变量。

实际上您已经非常接近了。您需要在块外定义
total
变量,只需使用

total=0
这将使它在所有迭代中保持不变。那你只需要换个零钱

students.each do |key, value|
  total=total+value
  puts total
end
它会做你想做的事


切换
value+counter=total
的顺序很重要,因为赋值(通过
=
)总是赋值给左边的变量。

使用您的代码做了一些小改动:--尝试以下操作:--


使用您的代码进行了一些小更改:--尝试以下操作:--


有很多方法可以做到这一点,但我将建议一种方法,它将教会您一些关于Ruby的不同事情。这也是解决这个问题的一种非常类似Ruby的方法

代码

students = {
class1: 11,
class2: 24,
class3: 38,
class4: 62 }

students.reduce(0) do |tot, (k,v)|
  tot += v
  puts k[/\d+/] + ") #{tot}"
  tot
end
1) 11
2) 35
3) 73
4) 135
解释

我使用(也称为
inject
)是因为该方法使用一个变量(此处为
tot
)来维护块内的运行总数,便于对一组数字求和。这正是你需要的

旁白:通过阅读Ruby方法的文档,您将学到很多东西。方法的引用方式如下:
SomeClass#method
SomeModule#method
。这里,
reduce
是模块
Enumerable
的一个实例方法
students
是类
Hash
的实例,但该类“混合”(包括)模块
Enumerable
的实例方法

对象
tot
是一个
Fixnum
,初始化为
reduce
的参数,此处为零。(如果未给出初始值,则来自
学生
--11--的初始值将分配给
tot
)。每次执行块中的代码时,块末尾的值都会返回给枚举器(这就是
tot
存在的原因)。在枚举了接收者
学生
的所有元素后,
tot
的值由
reduce
返回(尽管您不会使用该值)

第一次调用块时,块变量如下所示:

tot => 0
k   => :class1
v   => 11
印刷

1) 11
我假定您希望标签
1)
位于
:class1
的右端。要从符号
k=>:class1
中提取
1
,可以将该方法与正则表达式
/\d+/
一起使用,该正则表达式提取一个或多个数字0-9的字符串(尽可能多)

在阅读方法
Symbol#[]
的文档时,您将看到它将符号
:class1
转换为字符串
“class1”
,然后调用该字符串上的方法

自从Ruby 1.9+以来,许多人更喜欢使用而不是
reduce
。该方法的使用方式如下:

students.each_with_object(0) do |(k,v),tot|
  tot += v
  puts k[/\d+/] + ") #{tot}"
end

请注意,使用此方法,不必将对象的值(
tot
)返回给枚举器,
tot
位于块变量列表的末尾,而
reduce
则位于开头

有很多方法可以做到这一点,但我会推荐一种方法,教你一些关于Ruby的不同的东西。这也是解决这个问题的一种非常类似Ruby的方法

代码

students = {
class1: 11,
class2: 24,
class3: 38,
class4: 62 }

students.reduce(0) do |tot, (k,v)|
  tot += v
  puts k[/\d+/] + ") #{tot}"
  tot
end
1) 11
2) 35
3) 73
4) 135
解释

我使用(也称为
inject
)是因为该方法使用一个变量(此处为
tot
)来维护块内的运行总数,便于对一组数字求和。这正是你需要的

旁白:通过阅读Ruby方法的文档,您将学到很多东西。方法的引用方式如下:
SomeClass#method
SomeModule#method
。这里,
reduce
是模块
Enumerable
的一个实例方法
students
是类
Hash
的实例,但该类“混合”(包括)模块
Enumerable
的实例方法

对象
tot
是一个
Fixnum
,初始化为
reduce
的参数,此处为零。(如果未给出初始值,则来自
学生
--11--的初始值将分配给
tot
)。每次执行块中的代码时,块末尾的值都会返回给枚举器(这就是
tot
存在的原因)。在枚举了接收者
学生
的所有元素后,
tot
的值由
reduce
返回(尽管您不会使用该值)

第一次调用块时,块变量如下所示:

tot => 0
k   => :class1
v   => 11
印刷

1) 11
我假定您希望标签
1)
位于
:class1
的右端。要从符号
k=>:class1
中提取
1
,可以将该方法与正则表达式
/\d+/
一起使用,该正则表达式提取一个或多个数字0-9的字符串(尽可能多)

在阅读方法
Symbol#[]
的文档时,您将看到它将符号
:class1
转换为字符串
“class1”
,然后调用该字符串上的方法

由于Ruby 1.9+,许多人更喜欢使用