Необычное ключевое слово в выражении 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).

=== выглядит очень похоже ==, но их следует рассматривать как совершенно разные методы.

Другие вопросы по тегам