2015-11-29 20 views
-1

一種if語句,例如:爲什麼`while'循環從不檢查用戶輸入,而`if`語句呢?

if first_name || first_name.length == 0 
    puts "You can't leave the first name blank, try again: " 
    first_name = gets 
end 

功能正常,因爲它要求用戶輸入,並且當由不進入任何輸入(包括空格)進行測試,它輸出錯誤消息,接着提示用戶輸入,隨後,然而,當我嘗試使用相同的while循環:

while first_name || first_name.length == 0 
    puts "You can't leave the first name blank, try again: " 
    first_name = gets 
end 

循環不正常。

迴路執行以下操作代替:

•打印上述(OK)的錯誤消息

•請求用戶輸入(OK)

•一旦用戶輸入被接收到,則循環再次執行(錯誤)。

它不測試用戶(現在正確)輸入的長度,然後允許應用程序的其餘部分執行其任務。

我也試過unless,nil?等等,用循環內部的if語句糾正循環的錯誤,但沒有成功。我認爲while循環會在糾正錯誤後再次評估first_name,並發現其長度不再爲零,但事實證明情況並非如此。在Java中,要說某事不等於別的東西(例如,在字符串方面),我可以在變量名前面使用!。我可以在Ruby中做到這一點嗎?

+0

請描述什麼是「作品」是指在提到的第一個例子。具體一點:「當(某些條件)然後我執行這個代碼時,它(不管它是什麼),這是正確的。」對其他例子也一樣。要非常具體,並且記得解釋它的作用,以及它應該做什麼。 –

+1

嗨,韋恩,我編輯了這個問題,以便更容易理解。進一步的挖掘讓我弄清楚爲什麼這個循環以它的方式進行。浪費你的時間道歉(和其他人在這裏)。 – Paul

回答

1

你可以試試這個:

while first_name.length == 0 do 
    puts "You can't leave the first name blank, try again: " 
    first_name = gets 
end 

方式while週期的工作原理是它後while關鍵字評估聲明。如果它是true那麼它運行該塊。之後就是這樣。在您的案例中,因爲first_name始終存在,所以first_name || first_name.length == 0始終爲true。這就是每當你輸入任何內容時它會再次循環的原因。

+0

嗨馬克西姆,你是什麼意思,「作爲first_name永遠存在」? – Paul

+0

@Paul嘗試'first_name = gets;無論您想要什麼作爲輸入,都將放入4 if first_name'。 'first_name'將是字符串,但只有當它爲'false'或'nil'時,對象纔是false –

1

我覺得你的條件是錯誤的:條件

first_name || first_name.length == 0 

如果first_name是非零爲真,這將永遠是這樣,因爲你將它設置爲一個字符串。

1

經過進一步挖掘在互聯網上,我給.chomp一去,看看它會做,因爲我發現,當gets使用,它需要你的輸入,但顯然還插入一個\n轉義序列,當輸入被按下,這意味着我的循環沒有按要求運行。

通過使用gets.chomp,結合.empty?,我能夠從輸入中刪除該轉義序列,並且正確地使循環功能正常。

下面是正確的代碼,以防止無限循環:

first_name = gets.chomp 

while first_name.empty? do 

    puts "You can't leave the first name blank, try again: " 
    first_name = gets.chomp 

end