2011-07-31 65 views
1

我試圖使用正則表達式作爲條件內(直到)循環。 基本上,這是用於輸入數字密碼..使用正則表達式作爲條件循環(直到)

我想這個代碼

print "Password: " 
    x = gets.chomp.to_i 
    until (/^[\d]+(\.[\d]+){0,1}$/ === "#{x}") == "true" 
     print "Only numbers allowed, Password: " 
     x = gets.chomp.to_i 
    end 

但遺憾的是它沒有工作。

任何想法?

+0

我刪除了「[紅寶石]」從標題,這足以讓它的標籤。 –

回答

4

你不應該比較字符串"true"。事實上在Ruby中,你幾乎不需要明確地比較truefalse,因爲這是布爾表達式計算的結果。還要注意的是to_i可能不會做你所期望的:

"adsfasf34".to_i #=> 0 
"1adsfasf34".to_i #=> 1 

你可以做的是這樣的:

print "Password: " 
until (x = gets.chomp) =~ /^[\d]+(\.[\d]+){0,1}$/ 
    print "Only numbers allowed, Password: " 
end 
x = x.to_i 
+0

你更快,更簡潔,我會刪除:) – emboss

+0

謝謝你michael這些信息。有用。 – Sam

+0

我想問一下,現在的條件意味着「繼續打印,直到X **匹配模式** ..」在口語英語? – Sam

1

當然,這是行不通的。 ===(「triqual」)相當於「與同班同班同學」。所以,你在做什麼有問紅寶石如果

(a class of this regex is the same as the class of the string) equals string "true" 

在這種情況下,內部比較拙劣,絕不會工作開始(正則表達式和一個字符串是絕不相同類的反正),外一會從來沒有工作(Ruby沒有像ECMAscript的undefined魔術字符串常量)。

對於Ruby中的條件式,記住這一點很方便:任何除nilfalse以外的任何表達式都將是真的!所以正則表達式匹配運算符會做得很好(當沒有找到匹配項時,它會返回nil,這就是您要查找的內容,以及匹配發現時的偏移量 - 而Ruby中的任何整數都是「trueish」,甚至0)。

所以確實,

print "Password: " 
x = gets.chomp 

until /^[\d]+$/ =~ x 
    print "Only numbers allowed, Password: " 
    x = gets.chomp 
end 

pw =x.to_i 
+0

所以這意味着任何紅寶石的條件是達到真的,即使它不是在平等的情況下..對吧? 非常感謝這些有價值的信息,特別是對於像我這樣的24小​​時的紅寶石開發人員。 – Sam