Подтвердить что ты не робот

В Ruby, как узнать, нет ли строки в массиве?

В Ruby, как бы вернуть true, если строка не находится в массиве параметров?

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

... или знаете, как лучше это написать?

4b9b3361

Ответ 1

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

или

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

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

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

Ответ 2

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

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)

Ответ 3

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

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

>> d=["www", "blog", "foo", "bar"]
>> d.grep(/^foo$/)
=> ["foo"]
>> d.grep(/abc/)
=> []

Ответ 4

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

Пример:

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

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