2014-03-03 44 views
0

有沒有更好的寫作方式?我不喜歡寫的字「響應」一行有沒有更好的方式不重複自己(紅寶石)?

puts 'Good Day! Would you like a practice program?' 

choices = [1,2,3,4,5] 

while true 
    response = gets.chomp 
    if response == 'yes' || response =='YES' || response == 'Yes' 
    puts 'Here\'s your number.' 
    puts choices.sample 
    break 
    else 
    puts 'try again.' 
    end 
end 
+2

我希望codereview.stackexchange.com是一個功能性,足夠的站點有這些東西的問題生活在那裏的幫助,而不是所有的感謝 –

+0

!這對Ruby來說是一種迷人的體驗。 –

回答

4

三次嘗試

response = gets.chomp 
    if response.downcase == 'yes' 
    # statements 
    else 
    # statements 
    end 

這裏的響應值「是」可在值是字母的任意組合的像

是,是,是,是,是,是,是,等

+0

幾乎不錯,但不好寫無意義的空正則表達式。 – sawa

+3

另外,不需要在不同的步驟中分開'chomp'和'downcase'。 – sawa

+2

此外,這不完全是OP所要求的(儘管這可能不成問題)。它匹配'yEs'等輸入。你至少應該提到這個事實。如果你沒有注意到其中的差異,那麼這個答案是錯誤的。 – sawa

2

我想如下寫:

puts 'Good Day! Would you like a practice program?' 

choices = [1,2,3,4,5] 
# Kernel#loop repeatedly executes the block, until you break it 
loop do 
    response = gets.chomp 
    # Regexp#=== will be the good choice here to do the matching 
    if /^(yes|YES|Yes)$/ === response 
    # For any combination of yes values /^yes$/i === response 
    puts %{Here's your number: #{choices.sample}} 
    break 
    else 
    puts 'try again.' 
    end 
end 

讓我們運行代碼:

C:\ruby>ruby so.rb 
Good Day! Would you like a practice program? 
no 
try again. 
yes 
Here's your number: 3 
+0

你可以補充一下爲什麼你會這樣寫嗎? –

+0

好方法,但您需要錨點:'/是/ ==='否。昨天是星期天。' => true.' –

+0

@CarySwoveland這是很好的'/ ^(是|是|是)$ /'? –

4

另一種方式,只是爲了它的緣故:

['Yes', 'YES', 'yes'].include? response 
+1

實際上,這是迄今爲止唯一的答案,就是OP正在做的事情。 – sawa

1

您可以在case語句中使用正則表達式作爲測試,尾隨i表示不區分大小寫。

require 'readline' 

choices = Array(1..5) 

prompt = "Good Day! Would you like a practice program?" 

loop do 
    case Readline.readline(prompt + "\n") 
    when /yes/i 
    puts "Here's your number: #{choices.sample}" 
    break 
    else 
    prompt = 'Try again:' 
    end 
end 
+0

好嗎?(1..5).to_a'?:) –

+1

奧雅納以前用'/ yes/i'解決了問題,但是編輯到另一個解決方案,因爲這不是OP正在做的事(儘管它很接近,甚至可能更實用)。然而,如果你想比較不區分大小寫,那麼Alok的答案更有效率。 – sawa

+0

@sawa在看到你的[cooment]之後,我已經注意到了(http://stackoverflow.com/questions/22147663/is-there-a-better-way-to-not-repeat-myself-ruby/22147719#comment33607527_22147697)那。你有好眼睛。 :-)所以我改變了我的答案,以符合你的評論。 –

0

上述答案的另一種選擇可能是這樣的。

['Yes'.downcase].include? response.downcase #=> 

編輯:有效的評論後,一個更好的版本

['yes'].include? response.downcase #=> true for "yEs" 
+0

:-)你很對。 – Bala

+0

簡單的疏忽。請先刪除,然後刪除您的評論。 –

+0

是的,它是疏忽大意。但不要刪除你的評論,我寧願它在那裏:-)。 – Bala