В Ruby, как мне узнать, не находится ли строка в массиве? - PullRequest
30 голосов
/ 16 апреля 2011

Как в Ruby я мог бы вернуть true, если строка отсутствует в массиве опций?

# pseudo code
do_this if current_subdomain not_in ["www", "blog", "foo", "bar"]

... или вы знаете лучший способ написать это?

Ответы [ 4 ]

53 голосов
/ 16 апреля 2011
do_this unless  ["www", "blog", "foo", "bar"].include?(current_subdomain)

или

do_this if not ["www", "blog", "foo", "bar"].include?(current_subdomain)

Я использую метод Array # include? .

Однако использование unless довольно большая рубиновая идиома.

5 голосов
/ 16 апреля 2011

Помимо использования массива, вы также можете сделать это:

case current_subdomain
when 'www', 'blog', 'foo', 'bar'; do that
else do this
end

Это на самом деле намного быстрее:

require 'benchmark'
n = 1000000

def answer1 current_subdomain
  case current_subdomain
  when 'www', 'blog', 'foo', 'bar'
  else nil
  end
end

def answer2 current_subdomain
  nil unless  ["www", "blog", "foo", "bar"].include?(current_subdomain)
end

Benchmark.bmbm do |b|
  b.report('answer1'){n.times{answer1('bar')}}
  b.report('answer2'){n.times{answer2('bar')}}
end

Rehearsal -------------------------------------------
answer1   0.290000   0.000000   0.290000 (  0.286367)
answer2   1.170000   0.000000   1.170000 (  1.175492)
---------------------------------- total: 1.460000sec

              user     system      total        real
answer1   0.290000   0.000000   0.290000 (  0.282610)
answer2   1.180000   0.000000   1.180000 (  1.186130)


Benchmark.bmbm do |b|
  b.report('answer1'){n.times{answer1('hello')}}
  b.report('answer2'){n.times{answer2('hello')}}
end

Rehearsal -------------------------------------------
answer1   0.250000   0.000000   0.250000 (  0.252618)
answer2   1.100000   0.000000   1.100000 (  1.091571)
---------------------------------- total: 1.350000sec

              user     system      total        real
answer1   0.250000   0.000000   0.250000 (  0.251833)
answer2   1.090000   0.000000   1.090000 (  1.090418)
2 голосов
/ 28 апреля 2017

Вы можете попробовать exclude? метод вместо include?

Пример:

do_this if ["www", "blog", "foo", "bar"].exclude?(current_subdomain)

Надеюсь, эта помощь ... Спасибо

2 голосов
/ 16 апреля 2011
do this if not ["www", "blog", "foo", "bar"].include?(current_subdomain)

или вы можете использовать grep

>> d=["www", "blog", "foo", "bar"]
>> d.grep(/^foo$/)
=> ["foo"]
>> d.grep(/abc/)
=> []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...