所以我在想办法把用户输入的唐老鸭-ify 语句(稍后判断我)。
到目前为止,这是我的代码:
puts "Wanna get Donald Duck-ified?"
print "Type some text here:"
user_input = gets.chomp
if user_input.gsub!(/s/,"th").gsub!(/ce/,"th").gsub!(/ci/,"th").gsub!(/cy/,"th")
puts "Boop - there go your s's and soft c's!"
else
puts "Dang, you didn't have any s's or soft c's!"
end
puts "#{user_input}"
在用我自己的一些输入(特别是“方形循环凯撒圆”)对其进行测试后,我得到“未定义的方法 `gsub!'”对于 nil:NilClass"作为错误。
gsub怎么样!不明确的?如果代码本身以 user_input.gsub!(/s/,"th")
运行,没有任何其他方法支持,它可以正常工作。一旦添加了第二种方法,else
代码就会运行,并且只会替换“s”。所有四个,我都得到了上面的错误。
是否有另一种方法可以用单个替换替换多个模式(如 Ruby 文档所命名)?我花了最后几个小时研究这个问题,但我仍然不能完全说出问题是什么。
Ruby 新手。受到鼓舞和激励。 非常感谢。
最佳答案
不要使用#gsub!
链接。 (实际上,对于大多数代码,根本不要使用 #gsub!
。)
[gsub!] Performs the substitutions of String#gsub in place, returning str, or nil if no substitutions were performed.
将代码切换为#gsub
这不会导致副作用(耶!)并且总是返回一个字符串(耶!) - 只需将结果与原始(未修改的)字符串进行比较。
另外,可以使用接受散列的 gsub 形式(自 Ruby 1.9.something 起)。这有一个微妙的区别,即被替换的值本身不会被替换,尽管这在这里无关紧要。
user_input.gsub(/s|ce|ci|cy/, { "s"=>"th", "ce"=>"th", "ci"=>"th", "cy"=>"th" })
# or since all are replaced with "th" (which I just noticed =^_^=) ..
user_input.gsub(/s|ce|ci|cy/, "th")
(我仍然建议不要使用 gsub!
,因为我发现字符串的副作用令人不安。但是,当与上面的非链接形式一起使用时,它会可靠地工作。)
关于 ruby : "undefined method"错误;如何更有效地使用 gsub?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21058360/