我有红宝石问题
这是我正在尝试做的事情
def iterate1 #define method in given class
@var3 = @var2.split(" ") #split string to array
@var4 = @var3
@var4.each do |i| #for each array item do i
ra = []
i.each_char {|d| ra << counter1(d)} # for each char in i, apply def counter1
@sum = ra.inject(:+)
@sum2 = @sum.inject(:+) #have to do the inject twice to get values
end
@sum2
我知道我复杂了这个
基本上输入是一串字母和值,如“14556 this word 398”
我试图将每个值中的数字相加,由空白分隔,如(“”)
当我使用def iterate1方法时,块调用counter1方法就好了,但我只能得到字符串中最后一个单词或值的值。
在这种情况下,398,总和时为27。
如果我包含休息,我会得到第一个值,即21。
我希望输出一个包含所有求和值的数组
非常感谢任何帮助
答案 0 :(得分:2)
我想你是在追求:
"10 d 20 c".scan(/\b\d+\b/).map(&:to_i).inject(:+) # Returns 30
scan(/\b\d+\b/)
将提取仅由数组中的数字组成的所有数字,map(&:to_i)
会将它们转换为整数,我猜您已经知道inject(:+)
将会做什么。
我不确定我是否理解你正确的事情,所以如果你提供你期望的答案,这可能会有所帮助。
编辑:
如果要对每个数字中的数字求和,可以使用:
"12 d 34 c".scan(/\b\d+\b/).map { |x| x.chars.map(&:to_i).inject(:+) }
x.chars
将返回数字的枚举器,map(&:to_i)
会将它们转换为整数,inject(:+)
会将它们相加。
答案 1 :(得分:0)
最简单的答案是使用map
而不是each
,因为前者收集结果并返回一个数组。 e.g:
def iterate1 #define method in given class
@var3 = @var2.split(" ") #split string to array
@var4 = @var3
@var4.map do |i| #for each array item do i
ra = []
i.each_char {|d| ra << counter1(d)} # for each char in i, apply def counter1
@sum = ra.inject(:+)
@sum2 = @sum.inject(:+) #have to do the inject twice to get values
end
end
你可以写得更清洁,我觉得Stefan是一个很大的帮助。您可以通过稍微修改一下代码来解决问题
# when you call iterate, you should pass in the value
# even if you have an instance variable available (e.g. @var2)
def iterate(thing)
thing.scan(/\b\d+\b/).map do |x|
x.chars.map{|d| counter1(d)}.inject(:+)
end
end
以上假设counter1
方法将值返回为整数