2016-04-07 7 views
2

Ruby'de bunu yapmanın daha iyi bir yolu var mı?Birden çok if/else ifadesiyle işlem yapmanın daha iyi bir yolu nedir?

if params.has_key?(:comentario_page) 
    gon.position = 0 
elsif params.has_key?(:avaliacao_page) 
    gon.position = 1 
elsif params.has_key?(:seguindo_page) 
    gon.position = 2 
elsif params.has_key?(:seguidores_page) 
    gon.position = 3 
[and go on...] 
else 
    gon.position = 0 
end 

ı 10 if/else var diyelim.

+0

Oku http://stackoverflow.com/q/948135/128421. –

+0

'Params' nedir? – sawa

cevap

0

Açık olan yanıt, case ifadesini kullanmaktır. Daha az belirgin olan cevap, karşılaştırıcı değeri olmayan çıplak bir durum ifadesi kullanmaktır; Bu, her bir when vakasında true/false üzerinde test etmenizi sağlayan daha az bilinen bir sözdizimi seçimidir.

gon.position = case 
       when params.has_key?(:a) then 1 
       when params.has_key?(:b) then 2 
       when params.has_key?(:c) then 3 
       else 0 
       end 

ben kalır tekrarını (ya da bu biçimlendirme tarzı aşırı girinti) sevmiyorsun ama kullanıyorum ne olursa olsun metodoloji Muhtemelen bunu ilk etapta karma anahtarları üzerinde case götürdü planı ayrı ediyorum Gerisini çok fazla karıştırmak yerine.

0

Ben params ile çevredeki kod yok ama uydurma bir karma kullanarak aşağıdaki benim test çalışması gibiydi beri tam Bunu test edilemez:

key_set = [:key0, :key2, :key3, :key9] 
gon.position = key_set.map.with_index { |k, i| i if params.has_key? k }.compact.first || 0 

|| 0 sonunda İstenen else değerine karşılık gelir.

Bu, istenen değerin sıralı bir tamsayı olduğunu varsayar. Değilse, key_set dizisini değiştirmek için key_hash hedef değer kümesi oluşturun, .with_index'u kaybedin ve i if params.has_key? k'u key_hash[k] if params.has_key? k ile değiştirin.

Kötü haber, bunun kısa devre yapmadığıdır. Zaten bir tane bulunsa bile, tüm aday set anahtarlarından geçecektir.

0

Benzer şekilde @ pjs'ye, benimki tutmak için bir veri yapısı kullanırdım. Ancak, aslında ardışık sayılar hakkında konuştuğunuz belli değil. Bunun için, karma kullanabilirsiniz:

pages = {:comentario_page => 1, 
     :avaliacao_page => 2, 
     ..... 
} 

Bu şekilde, geçirilen parametre dayalı mantıklı ne olursa olsun değer yakalayabilir. sınıf gon kullandığınıza göre, bunu

gon = Gon.new(params) 
... 
gon.position = [value] 

Durum açıklamalarının gibi örneğini verebilir ve eğer/else yapılar kötü seçenek burada.keys varsayalım

0
keys = %i[comentario_page avaliacao_page seguindo_page seguidores_page ...] 
gon.position = 
case (keys & params.keys).first 
when :comentario_page then 0 
when :avaliacao_page then 1 
when :seguindo_page then 2 
when :seguidores_page then 3 
... 
else 0 
end 
3

verilen anahtarların bir dizidir:

keys = [:comentario_page, :avaliacao_page, :seguindo_page, :seguidores_page] 

Sonra yazabilirsiniz:

def gon_position(keys, params) 
    keys.index { |k| params.has_key?(k) }.to_i 
end 

Not olduğunu index getiri nil, nil.to_i #=> 0 eğer. Örneğin

:

params = { :a=>1, :avaliacao_page=>2, :seguindo_page=>3, :b=>4 } 
gon_position(keys, params) 
    #=> 1 

params = { :a=>1, :b=>4 } 
gon_position(keys, params) 
    #=> 0 
İlgili konular