Методы Ruby, эквивалентные "if a in list" в python? - PullRequest
17 голосов
/ 07 октября 2009

В Python я могу использовать это, чтобы проверить, есть ли элемент в списке a:

>>> a = range(10)
>>> 5 in a
True
>>> 16 in a
False

Как это можно сделать в Ruby?

Ответы [ 2 ]

26 голосов
/ 07 октября 2009

Используйте метод <a href="http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_array.html#Array.include_qm" rel="noreferrer">include?()</a>:

(1..10).include?(5) #=>true
(1..10).include?(16) #=>false

EDIT: (1..10) равно Диапазон в Ruby, в случае, если вы хотите массив (список):

(1..10).to_a #=> [1,2,3,4,5,6,7,8,9,10]
10 голосов
/ 07 октября 2009

У диапазона есть метод ===, который проверяет, является ли аргумент частью диапазона.

Вы используете это так:

(1..10) === 5  #=> true
(1..10) === 15 #=> false

или как вы написали:

a= (1..10)
a === 5  #=> true
a === 16 #=> false

Вы должны быть уверены, что значения диапазона и тестируемое значение имеют совместимый тип, в противном случае будет выдано исключение.

(2.718..3.141) === 3 #=> true
(23..42) === "foo"   # raises exception
  • Это делается в O (1), так как Range # === (значение) сравнивает значение только с Range # first и Range # last.
  • Если вы сначала вызываете Range # to_a, а затем Array # include?, Он запускается в O (n), так как Range # to_a должен заполнить массив n элементами, а Array # include? необходимо снова выполнить поиск по n элементам.

Если вы хотите увидеть разницу, откройте irb и наберите:

(1..10**9) === 5            #=> true
(1..10**9).to_a.include?(5) # wait some time until your computer is out of ram and freezess
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...