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+,许多人更喜欢使用