数组的布尔方法'Blackjack'

时间:2016-04-26 07:37:39

标签: arrays ruby

我正在尝试编写一个布尔方法来检查数组中的整数之和是否等于21.这是代码:

def twenty_one? (*arr) 
  arr.inject(0){|sum,x| sum + x }
  arr.eql? (21)
end

但如果我检查

puts twenty_one?(19, 2)

它返回false,即使我也尝试了其他一些。我在这段代码中缺少什么?

2 个答案:

答案 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博客:+