我有一个值“狗”和一个数组[“猫”、“狗”、“鸟”]。

如何在不循环的情况下检查数组中是否存在它?是否有一种简单的方法来检查该值是否存在?


当前回答

有多种方法可以实现这一点。其中一些如下:

a = [1,2,3,4,5]

2.in? a  #=> true

8.in? a #=> false

a.member? 1 #=> true

a.member? 8 #=> false

其他回答

如果你不想使用include?您可以首先将元素包装在数组中,然后检查包装的元素是否等于数组和包装的元素的交集。这将返回一个基于相等的布尔值。

def in_array?(array, item)
    item = [item] unless item.is_a?(Array)
    item == array & item
end

在下面尝试

(['Cat', 'Dog', 'Bird'] & ['Dog']).any?

使用Enumerable#include:

a = %w/Cat Dog Bird/

a.include? 'Dog'

或者,如果完成了大量测试,1您可以摆脱循环(甚至包括?has),并通过以下方式从O(n)变为O(1):

h = Hash[[a, a].transpose]
h['Dog']

1.我希望这是显而易见的,但为了避免反对意见:是的,对于几个查找,Hash[]和转置操作占据了配置文件的主导地位,并且每个操作本身都是O(n)。

这边怎么样?

['Cat', 'Dog', 'Bird'].index('Dog')

有趣的事实,

可以使用*检查case表达式中的数组成员资格。

case element
when *array 
  ...
else
  ...
end

注意when子句中的小*,它检查数组中的成员身份。

splat运算符的所有常见魔术行为都适用,所以例如,如果数组实际上不是一个数组,而是一个元素,那么它将匹配该元素。