Arrays 布尔方法&x27;21点';用于阵列
我试图写一个布尔方法,检查数组中的整数和是否等于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
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
或者您可以使用ActiveSupportEnumerable#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,:+)
来确保整数结果。