Arrays 布尔方法&x27;21点';用于阵列

Arrays 布尔方法&x27;21点';用于阵列,arrays,ruby,Arrays,Ruby,我试图写一个布尔方法,检查数组中的整数和是否等于21。代码如下: def twenty_one? (*arr) arr.inject(0){|sum,x| sum + x } arr.eql? (21) end 但如果我查一下 puts twenty_one?(19, 2) 它返回false,尽管我也尝试了一些其他方法。这段代码缺少什么?可枚举#注入不会将数组转换为数字。检查数组和数字的相等性,它总是返回false。根据您的逻辑,您应该将inject的结果与数字进行比较: def

我试图写一个布尔方法,检查数组中的整数和是否等于21。代码如下:

def twenty_one? (*arr) 
  arr.inject(0){|sum,x| sum + x }
  arr.eql? (21)
end
但如果我查一下

puts twenty_one?(19, 2)
它返回
false
,尽管我也尝试了一些其他方法。这段代码缺少什么?

可枚举#注入不会将数组转换为数字。检查数组和数字的相等性,它总是返回
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

如果在数组末尾注入一个sum,它将保存数组的总数,但一旦超出代码块,作用域就会丢失,您必须将其分配给一个变量,如Ilya所示,或者使用这个较短的版本,直接将结果与21进行比较

def twenty_one? (*arr) 
  arr.inject(:+) == 21
end

有关inject和shothand的详细说明,请参见博客:+

使用
eql?
真的很不寻常。通常应为
==
。是Rails/ActiveSupport方法。您是第一个回答的人,请记住,
inject
将数组中的第一个元素作为种子,如果不提供任何参数,这会更干净。@peter是的,我只是自己测试了一下,当时我正在思考在
sort\u by
的上下文中进行比较是如何导致问题的,但是
==
很酷。@CarySwoveland可能应该在忘记了类似的事情之后才这么做!虽然
=
在这种情况下有效,但我会使用
注入(0,:+)
来确保整数结果。