1

我正在创建一个方法,该方法将采用一组数字并将它们相加。我不想用inject,因为我还没学会。我更喜欢从基础开始。我想使用eachwhile

我一直在重写这段代码并rspec针对nil. 我尝试做一个if else语句来设置nil数组0是否为empty?,但这似乎不起作用。这就是我现在所拥有的。

def sum(x)
  total = 0 
  sum.each { |x| total += x}
  total
end

rspec正在测试一个空数组[]以及其他具有多个整数的数组。想法?

4

4 回答 4

1

您不是在枚举传入方法的数组,而是在枚举变量sum。您想要x.each { |x| total += x},尽管在这种情况下使用xwithin{}有点奇怪,因为您已经为方法参数使用了名称。

于 2013-08-21T21:36:51.300 回答
0

您可以使用s 从数组compact!中删除。nil

def sum(x)
  total = 0
  x.compact! #lose the nils
  x.each { |i| total += i}
  total
end

编辑:如果x传递给您的sum()方法是nil,您可以使用nil?.

做类似的事情

if x.nil?
  0 #assuming you want to return 0
else
  #rest of your function
于 2013-08-21T21:43:21.903 回答
0

nil如果传入的数组为空,你想返回吗?

您对标识符感到困惑。您正在尝试迭代sum,这是方法的名称,并且您同时x用作方法参数和迭代块参数。

我建议您使用更具描述性arr的内容,例如方法参数和v块参数(保存数组中每个的值)。

最后,您需要将总数初始化为,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
于 2013-08-21T23:06:48.870 回答
-1

您可以为 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
于 2013-08-21T22:17:25.013 回答