Ruby案例表达式意外关键字

时间:2018-04-19 18:23:37

标签: ruby switch-statement include gsub case-expression

我是Ruby新手。我的过去是Java。我试图使用一个switch case,显然在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或','或&#39 ;;'或' \ n'     当user_input.include? (" S&#34)

rb.rb:11 :语法错误,意外的keyword_when,期待keyword_end     当user_input.include? (" CH&#34)         ^

rb.rb:13 :语法错误,意外的keyword_when,期待keyword_end     当user_input ==""         ^

rb.rb:15 :语法错误,意外的keyword_when,期待keyword_end     当user_input!=""         ^ rb.rb:17 :语法错误,意外的keyword_else,期待keyword_end

rb.rb:21 :语法错误,意外的keyword_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 个答案:

答案 0 :(得分:0)

我的理解是,您希望在字符串包含"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",则会显示。 (when行可以写成when /s/, /ch/,但我也不喜欢这样,部分原因是/s|ch/仍然需要gsub!&#39 ; s第一个论点。)

请注意,case语句使用方法Regexp#===。因此,我们看到/s/.===(s) #=> true。 Ruby允许我们写出/s/ === 'chester'("句法糖")。

user_input = <anything>必须在循环之前,以便在循环后显示其值。

Kernel#loop。对于此方法的其他用途,在使用枚举器(Enumerator类的实例)时,处理StopIteration异常非常有用。

===看起来很像==,但应该将它们视为完全不同的方法。