我是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对空间敏感。我删除了空白区域并且工作正常。我遇到了布尔问题,然后修复了它。它现在按预期工作。
答案 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
异常非常有用。
===
看起来很像==
,但应该将它们视为完全不同的方法。