我正在尝试编写一个布尔方法来检查数组中的整数之和是否等于21.这是代码:
def twenty_one? (*arr)
arr.inject(0){|sum,x| sum + x }
arr.eql? (21)
end
但如果我检查
puts twenty_one?(19, 2)
它返回false
,即使我也尝试了其他一些。我在这段代码中缺少什么?
答案 0 :(得分:6)
Enumrable#inject
不会将数组转换为数字。检查数组和数字的相等性,它总是返回false
。根据您的逻辑,您应该将inject
的结果与数字进行比较:
def twenty_one? (*arr)
sum = arr.inject(0) { |sum,x| sum + x }
sum.eql?(21)
end
twenty_one?(19, 2)
#=> true
或者您可以使用reduce
:
def twenty_one?(*arr)
arr.reduce(:+) == 21
end
或者您可以使用ActiveSupport Enumerable#sum
来缩短时间:
def twenty_one?(*arr)
arr.sum == 21
end
答案 1 :(得分:4)
你注入的数字将保留在数组末尾的总数但是一旦在代码块之外范围丢失,你必须将它分配给像Ilya显示的变量或使用这个较短的版本将这个结果与21比较直接走了。
def twenty_one? (*arr)
arr.inject(:+) == 21
end
有关注入和射击的详细说明,请参阅this博客:+