Использование регулярных выражений в качестве условного цикла (до) - PullRequest
1 голос
/ 01 августа 2011

Я пытаюсь использовать регулярное выражение в качестве условия внутри (до) цикла. в основном, для ввода числового пароля ..

Я попробовал этот код

   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

но, к сожалению, это не сработало.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 01 августа 2011

Вы не должны сравнивать со строкой "true".На самом деле в Ruby вам едва ли нужно явно сравнивать с true или false, поскольку это то, к чему относятся булевы выражения.Также обратите внимание, что 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
1 голос
/ 01 августа 2011

Конечно, это не работает.=== ("triqual") является эквивалентом "Имеет тот же класс, что и".Итак, что вы там делаете, спрашиваете Ruby:

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

Внутреннее сравнение в этом случае неэффективно и никогда не сработает с начала (Regexp и строка никогда не принадлежат к одному и тому же классу в любом случае), внешнееникогда не сработает (Ruby не имеет магических строковых констант, таких как undefined * в ECMAscript).

Для условных выражений в Ruby полезно запомнить это: любое выражение, вычисляющее что-либо, кроме nil или false, будетбыть правдой!так что оператор совпадения с регулярным выражением будет работать нормально (он возвращает 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
...