2017-02-11 90 views
0

if語句我很新的節目,我嘗試使用測試多個條件中的if語句,看看輸入的號碼5,10,或15。如果沒有的話它會輸出一條錯誤消息。不管輸入什麼號碼,它總是輸出錯誤信息。使用多個條件在紅寶石

when 3 
    print("Enter the discount percentage, must be (5, 10, or 15)") 
    dis= gets.to_i 
    if (dis != 5 || dis != 10 || dis != 15) 
    puts("You entered an invalid discount") 
    else 
    end 
+0

正確的方法來獲取從字符串的開頭的整數是['to_i'](http://ruby-doc.org/core /String.html#method-i-to_i),而不是'_i'。 –

+0

'p || q'與'!(!p &&!q)'(來自德摩根定律)相同。所以你的表達和'!(dis == 5 && dis == 10 && dis == 15)'是一樣的。括號中的表達式顯然對'dis'的任何值都是'false',所以'!(false)#=> true',不管'dis'的值如何,都會執行puts。 –

+0

爲什麼急於選擇答案? –

回答

1

你的病情正確的邏輯是

if dis != 5 && dis != 10 && dis != 15 

因爲你要打印的錯誤,如果數量不是5,也不是10,也不是15 寫的是一個更冷靜的方式

if [5, 10, 15].all? { |i| dis != i } 
+2

甚至如果[5,10,15] .none? {| i | DIS ==我}' –

+0

是啊,很酷,甚至:) – Ursus

+0

感謝您向我展示了2種不同的寫作方式和解釋原因。非常感謝它。 –

1

人們可以使用Enumerable#grep

puts ("You entered an invalid discount") unless [5,10,15].grep(dis).any? 
+2

我覺得'任何?'在這裏都會更清楚。 – pjs

+0

謝謝,以前沒有見過這樣的人,因爲我對這件事還是很新的。我將保存這個以備將來使用。 –

+0

@pjs實際上沒有'任何?'它不會工作(因爲空數組是真的),所以感謝您的注意! –

2
puts ("You entered an invalid discount") unless [5,10,15].include?(dis) 
0

只是另一種方式使用正則表達式:

puts "Enter discount, must be 5,10 or 15" 
puts gets[/\A1?[05]\n\z/] ? 'Discount applied' : 'Invalid discount'