web-dev-qa-db-fra.com

Dans Ruby, comment savoir si une chaîne n'est pas dans un tableau?

Dans Ruby, comment pourrais-je retourner true si une chaîne n'est pas dans un tableau d'options?

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

... ou connaissez-vous une meilleure façon d'écrire ceci?

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

ou

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

J'utilise la méthode Array # include? .

Cependant, l'utilisation de unless est un assez gros Ruby idiome.

54
Mike Lewis

En plus d'utiliser un tableau, vous pouvez également le faire:

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

C'est en fait beaucoup plus rapide:

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)
5
sawa

Tu peux essayer exclude? méthode au lieu de include?

Exemple:

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

J'espère que cette aide ... Merci

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

ou vous pouvez utiliser grep

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