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,它不仅读起来更清晰,而且解决了我的问题!谢谢你的帮助!