Ruby 可能将数组与nil一起添加
我正在创建一个方法,该方法将获取一个数字数组并将它们相加。我不想使用Ruby 可能将数组与nil一起添加,ruby,arrays,rspec,sum,each,Ruby,Arrays,Rspec,Sum,Each,我正在创建一个方法,该方法将获取一个数字数组并将它们相加。我不想使用inject,因为我还没有学会。我更喜欢从基础开始。我想使用每个或while 我一直在重新编写此代码,并针对rspec对其进行测试,但我一直遇到一个问题,因为第一次测试包含数组为空且nil。我尝试使用if-else语句将nil设置为0(如果数组为空?),但这似乎不起作用。这是我现在得到的 def sum(x) total = 0 sum.each { |x| total += x} total end rspec
inject
,因为我还没有学会。我更喜欢从基础开始。我想使用每个
或while
我一直在重新编写此代码,并针对rspec
对其进行测试,但我一直遇到一个问题,因为第一次测试包含数组为空且nil
。我尝试使用if-else
语句将nil
设置为0
(如果数组为空?
),但这似乎不起作用。这是我现在得到的
def sum(x)
total = 0
sum.each { |x| total += x}
total
end
rspec
正在测试一个空数组[]
以及其他具有多个整数的数组。想法?您不是在枚举传入方法的数组,而是在枚举变量sum
。您需要x。虽然在{}
中使用x
有点奇怪,因为您使用了方法参数的名称。您可以使用从数组中删除nil
def sum(x)
total = 0
x.compact! #lose the nils
x.each { |i| total += i}
total
end
编辑:
如果传递给您的sum()
方法的x
是nil
,您可以使用检查
他们会做一些类似的事情
if x.nil?
0 #assuming you want to return 0
else
#rest of your function
您可以为Array类创建新的实例方法:
class Array
def sum
total = 0.0
self.each {|x| total += x if ['Fixnum', 'Float'].include?(x.class.name)}
total%1==0 ? total.to_i : total
end
end
那么你会这样使用它:
puts [].sum # => 0
puts [1, 2, 3].sum # => 6
puts [2, nil, "text", 4.5].sum # => 6.5
如果传入的数组为空,是否要返回nil
您对标识符感到困惑。您正在尝试迭代sum
,它是方法的名称,并且您正在使用x
作为方法参数和迭代块参数
我建议您使用更具描述性的方法,例如方法参数使用arr
,块参数使用v
(保存数组中每个值的值)
最后,您需要将total初始化为nil
,以便在数组为空时返回正确的值。不幸的是,您无法对nil
进行算术运算,因此在下面的代码中,我添加了一行,将total
设置为零(如果尚未设置)
这会满足你的要求
def sum(arr)
total = nil
arr.each do |v|
total = 0 unless total
total += v
end
total
end
p sum [1,2,3]
p sum []
输出
6
nil
您所说的“空且nil
”是什么意思?对不起。。。我想这有点多余,但我的意思是其中一个测试是在阵列为空时运行的。。。这将返回nil而不是0Peter!!非常感谢。。。我以为我已经试过了,但我认为你是对的。。奇怪的是,我在{}中使用了x,所以我决定将它改为num,它不仅读起来更清晰,而且解决了我的问题!谢谢你的帮助!