Rubymonk Ascent课程:"撕裂勇气"

时间:2015-12-07 22:34:40

标签: ruby

从Rubymonk上升教程" Ripping the Guts",这段代码之间的区别是什么:(我的)

# compute([[4, 8], [15, 16]])

def compute(ary)
  return nil unless ary
  ary.map do |a, b| 
    a + b unless b.nil?
    a if b.nil?
  end
end

并给出了解决方案:

def compute(ary)
  return nil unless ary
  ary.map { |(a, b)| !b.nil? ? a + b : a }
end

我的代码没有通过测试,但解决方案确实如此。他们看起来像做同样的事情。我做错了什么?

1 个答案:

答案 0 :(得分:4)

如果b.nil?为false,则为以下行:

a if b.nil?

评估为nil。由于这是块中的最后一个语句,因此这是从块返回的值。它没有看到nil并且返回上一行的值,或者完全“跳过”该行,因为if不是真的,它只返回nil

如果您对而不是返回值感兴趣,那么我认为您的代码将与给定的解决方案做同样的事情。语句aa + b不会被评估,除非它们是您感兴趣的结果(如果它们是方法调用做外部事务,这将非常重要。)