2017-08-13 12 views
0

低於假設的案例陳述考慮三個變量:紅寶石 - 選舉最新狀況相匹配,而不是第一個條件匹配

  • 年齡
  • garlic_allergy

隨着case語句下面的目標是讓「結果」變量更新爲最新條件,而不是第一個條件匹配。例如如果用戶輸入變量age = 90,garlic_allergy = false,name = Dracula,則case語句應該返回「絕對是吸血鬼」(滿足最新條件),而不是「可能不是吸血鬼」(滿足第一個條件) 。

case 
    when age.to_i < 100 && garlic_allergy = false 
     result = "Probably NOT a vampire" 
    when age.to_i < 100 && garlic_allergy = true 
     result = "Maybe a vampire" 
    when age.to_i > 100 && garlic_allergy = true 
     result = "almost certainly a vampire" 
    when name = "Dracula" 
     result = "Definitely a vampire" 
    else 
     result = "Results inconclusive" 
    end 

    puts result 
    end 

這是一個例子情況,但試圖找出如何爲任何聲明的情況下做到這一點,或者如果/ ELSIF /其他多個條件,等等......如何確保程序始終貫穿聲明每當/ elsif聲明並返回最新狀態時。我試圖通過在一個循環中包裝語句來做到這一點,但還沒有任何運氣。

回答

0

創建數組與條件

conditions = [] 

conditions.push lambda { |name, age, garlic_allergy| 
    'Probably NOT a vampire' if age < 100 and not garlic_allergy 
} 

conditions.push lambda { |name, age, garlic_allergy| 
    'Maybe a vampire' if age < 100 and garlic_allergy 
} 

conditions.push lambda { |name, age, garlic_allergy| 
    'almost certainly a vampire' if age > 100 and garlic_allergy 
} 

conditions.push lambda { |name, age, garlic_allergy| 
    'Definitely a vampire' if name == 'Dracula' 
} 

,降低您的條件,到最後成功之一。

result = conditions.inject('Results inconclusive') { |current, x| 
    r = x.(name, age, garlic_allergy) 

    r != nil ? r : current 
} 

注意的inject初始值是後備條件,這將被保存在案件沒有條件取得成功。