2016-04-07 121 views
2

在Ruby中有更好的方法嗎?什麼是處理多個if/else語句的更好方法?

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

+0

讀http://stackoverflow.com/q/948135/128421。 –

+0

什麼是「params」? – sawa

回答

0

顯而易見的答案是使用case聲明。不太明顯的答案是使用沒有比較值的裸案語句;這是一個鮮爲人知的語法選擇,它允許您在每個when的情況下在true/false上進行測試。

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 

我不喜歡那個仍然重複(或在此格式化風格過度縮進),而導致我case在哈希鍵擺在首位,我可能會重構任何方法我使用,而不是讓其他人過度忙碌。

0

不能完全測試這個,因爲我不params有你周圍的代碼,但是我用一個虛構的哈希值以下的測試似乎工作:

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末對應於期望的else值。

這裏假定期望的值是一個連續的整數。如果不是,則創建目標值的散列key_hash以替換陣列key_set,丟失.with_index,並用key_hash[k] if params.has_key? k替換i if params.has_key? k

壞消息是這不會短路。它將遍歷整個候選鍵集,即使它已經找到了。

0

與@pjs類似,我會使用數據結構來保存我的。但是,我不清楚你實際上在談論連續數字。爲此,我們可以使用散列:

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

這樣,您可以根據傳遞的參數獲取任何有意義的值。由於您使用的是類坤,因此您可以這樣實例化它

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

在這裏,Case語句和if/else結構是糟糕的選擇。

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

假設keys是給定的按鍵陣列:

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

然後,你可以寫:

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

注意,如果index回報nilnil.to_i #=> 0

例如:

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 
相關問題