2016-08-19 33 views
-1

我試圖創建一個程序來測試插入的輸入是文本還是數字還是特殊字符。所以我用!a.is_a? Integer。但是,我的代碼似乎不工作。我得到這個錯誤:測試輸入的數字是否不是文本 - RUBY

syntax error, unexpected TCONSTANT. expecting keyword then ,

這裏是我的代碼:

print "Enter Number Please: " 
a = gets.chomp.to_i 

answer = case a 

when 3 
    "OUTPUT: a is 3" 
when 4 
"OUTPUT: a is 4" 
when !a.is_a? Integer 
    "You did not enter a number." 
else 
    "OUTPUT: a is neither 3, nor 4" 
end 

puts answer 

我理解這可能是更好的嘗試與整型(OBJ),但有什麼辦法,使這項工作?

回答

2

這裏有幾件事要注意。舉一個,to_i的結果是總是一個整型值。測試!a.is_a? Integer是多餘的,因爲這永遠不會失敗。

您還需要記住的是,case語句本身使得它非常容易比較類:

case (a) 
when Integer 
    puts "I'm a number!" 
when String 
    puts "I'm a string!" 
end 

注意第一個條件自動觸發任何整數值。

即使它們相當慷慨,您可以在when條款中放置什麼也是有限制的。爲了讓解析器正確地解釋你問什麼,你必須表達出來是這樣的:

when !a.is_a?(Integer) 

雖然所指出這可以降低到when Integer所以剩下的這些是多餘的。

您還需要避免在case部分中指定某些內容,然後再引用一個變量。任何閱讀你的代碼的人都會感到困惑,這可能是不必要的。如果您正在處理複雜的邏輯問題,請使用一系列if聲明來說明問題。

+0

在另一方面,'gets'總是會返回一個字符串,所以'當Integer'條件將永遠不會被觸發。 – Stefan

+2

此外,'when!a.is_a?(Integer)'相當於'when true'或'false when',因爲表達式在用於比較之前將被展開。因此他們也不會在這裏匹配。爲了檢查複雜的條件,你必須使用Procs中的'when - >(v){!v.is_a?(Integer)}' –

0

您可以用三元做得一樣好,我認爲,像這樣:

def integer?(number) 
    number.is_a?(Integer) ? "This is a number" : "This is not a number" 
end 
相關問題