从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
我的代码没有通过测试,但解决方案确实如此。他们看起来像做同样的事情。我做错了什么?
答案 0 :(得分:4)
如果b.nil?
为false,则为以下行:
a if b.nil?
评估为nil
。由于这是块中的最后一个语句,因此这是从块返回的值。它没有看到nil
并且返回上一行的值,或者完全“跳过”该行,因为if
不是真的,它只返回nil
。
如果您对做而不是返回值感兴趣,那么我认为您的代码将与给定的解决方案做同样的事情。语句a
和a + b
不会被评估,除非它们是您感兴趣的结果(如果它们是方法调用做外部事务,这将非常重要。)