Необычное ключевое слово в выражении Ruby
Я новичок в Ruby. Мое прошлое в Java. Я пытаюсь использовать регистр переключателя, очевидно известный как выражение регистра в Ruby. Я хочу принять пользовательский ввод, проверить этот ввод, чтобы увидеть, содержит ли он определенные символы, а затем заменить эти символы другими символами. Когда я пытаюсь запустить эту простую программу, я получаю много синтаксических ошибок, но я не уверен, почему. Может ли кто-нибудь объяснить мне, правильно ли я использую это утверждение и могу ли я использовать выражение case в этой ситуации? Спасибо.
empty_string = true
while empty_string do
print "Pleathe enter a thtring: "
user_input = gets.chomp
user_input.downcase!
case
when user_input.include? ("s")
user_input.gsub!(/s/, "th")
when user_input.include? ("ch")
user_input.gsub!(/ch/, "th")
when user_input == ""
puts "You typed noting! You get nothing sir!"
when user_input != ""
empty_string = false
else
puts "There are no 's's in your string."
end
end
puts "Zai jian, #{user_input}"
Ниже приведены ошибки, коррелирующие по строке и синтаксической ошибке.
rb.rb: 9: синтаксическая ошибка, непредвиденная ( arg, ожидая keyword_then или ',' или ';' или '\n' когда user_input.include? ("s")
rb.rb: 11: синтаксическая ошибка, неожиданное ключевое слово_когда, ожидание ключевого слова_не конец, когда user_input.include? ("ч") ^
rb.rb: 13: синтаксическая ошибка, неожиданное ключевое слово_when, ожидаемое ключевое слово_end, когда user_input == "" ^
rb.rb: 15: синтаксическая ошибка, неожиданное ключевое слово_when, ожидаемое ключевое слово_end, когда user_input! = "" ^ rb.rb: 17: синтаксическая ошибка, непредвиденное ключевое слово_else, ожидаемое ключевое слово-конец
rb.rb: 21: синтаксическая ошибка, неожиданный ключевое слово_end, ожидаемый конец ввода
НИЖЕ ФИКСИРОВАННЫЙ КОД СПАСИБО @Phlip
empty_string = true
while empty_string do
print "Pleathe enter a thtring: "
user_input = gets.chomp
user_input.downcase!
case
when user_input.include?("s")
user_input.gsub!(/s/, "th")
empty_string = false
when user_input.include?("ch")
user_input.gsub!(/ch/, "th")
empty_string = false
when user_input == ""
puts "You typed noting! You get nothing sir!"
empty_string = true
else
puts "There are no 's's in your string."
end
end
puts "Zai jian, #{user_input}"
Проблема заключалась в том, что у меня были пробелы после.include?, @Phlip сказал мне, что Ruby чувствителен к пространству. Я удалил пустое пространство, и это сработало. Я столкнулся с проблемой с логическим значением после и исправил это. Работает как задумано сейчас.
1 ответ
Насколько я понимаю, вы хотите попросить пользователя строку, пока строка не содержит "s"
или же "ch"
, Когда такая строка найдена, вы хотите сделать одну или несколько замен в строке и распечатать строку, содержащую измененную строку. Вот Ruby-подобный способ сделать это.
user_input = nil
loop do
print "Pleathe enter a thtring: "
user_input = "cheater" # gets.chomp.downcase
case user_input
when /s/
user_input.gsub!('s','th')
break
when /ch/
user_input.gsub!('ch','th')
break
when ""
puts "You typed noting! You get nothing sir!"
else
puts "There are no 's's in your string."
end
end
puts "Zai jian, #{user_input}"
Если пользователь вводит пустую строку, "You typed noting! You get nothing sir!"
а потом "Pleathe enter a thtring: "
отображаются и gets
ждет еще одна запись.
Если пользователь вводит непустую строку, которая не содержит "s"
или "ch"'s, "Pleathe enter a thtring: "
отображается и gets
ждет еще одна запись.
Если пользователь вводит "Chester\n"
"Zai jian, chethter"
отображается Если пользователь вводит "Cheater\N"
"Zai jian, theater"
отображается.
Если вы действительно хотите заменить все "s"
и "ch"
, замените следующие два первых when
заявления.
when /s|ch/
user_input.gsub!(/s|ch/,'th')
break
Если это сделано, и пользователь вводит "Chester"
"thethter"
отображается. (The when
вместо этого можно написать строку when /s/, /ch/
Но мне это тоже не нравится, отчасти потому, что /s|ch/
все еще нужно как gsub!
Первый аргумент.)
Обратите внимание, что операторы case используют метод Regexp # ===. Поэтому мы видим, что /s/.===(s) #=> true
, Руби позволяет нам писать, что /s/ === 'chester'
("синтаксический сахар").
user_input = <anything>
должен предшествовать циклу, чтобы сделать его значение видимым после цикла.
Смотрите Kernel # loop. Для других применений этого метода обработка StopIteration
Исключения очень полезны при работе с перечислителями (экземплярами класса Enumerator).
===
выглядит очень похоже ==
, но их следует рассматривать как совершенно разные методы.