2011-04-16 14 views
23

Ruby'de, bir dize bir seçenekler dizisinde değilse nasıl doğru dönerdim?Ruby'de, bir dizenin bir dizide olup olmadığını nasıl anlarım?

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

... ya da bunu yazmanın daha iyi bir yolunu biliyor musunuz?

+0

olası yinelenen [Test değişkeni birkaç dizeleri eşleşmesi halinde w/uzun olursa elsif zincir veya durumda o -when] (http://stackoverflow.com/questions/4893816/test-if-variable-matches-any-of-several-strings-wo-long-if-elsif-chain-or-case) –

cevap

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

veya

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

Ben Array#include? yöntemi kullanıyorum. Bununla birlikte, unless'un kullanılması oldukça büyük bir yakut deyimidir.

+1

'do_this ise ! ["www", "blog", "foo", "bar"].? (current_subdomain) 'çalışmalarını içerir. Karmaşık koşullar için, örnek bir: '&&!' Örnek iki: 've değil. –

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

veya bir dizi kullanmanın yanı sıra grep

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

kullanabilirsiniz, ayrıca bunu yapabilirsiniz:

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) 
+0

'answer2' içinde,' ["www», "blog", "foo", "bar"] 'dizisini, dizinin dışında bir sabit olarak tanımlamak daha hızlıdır, ancak yine de' when' işlevini kullanmaktan daha yavaştır. – cbliard

1

:

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

Bu çok daha hızlı aslında exclude? deneyebilirsiniz yerine yöntemi include?

Örnek:

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

Umut bu yardım ... Teşekkürler ait

+1

hariç tutuluyor mu? sadece ActiveSupport kütüphanesinden gelir. Çekirdek Ruby'de resmi olarak desteklenmiyor. – mhd

İlgili konular