Ruby:“未定义的方法”错误;如何更有效地使用gsub?

时间:2014-01-11 03:56:54

标签: ruby gsub

所以我试图找到一种方法来报告唐纳德·唐伊(Donald Duck-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新手。鼓励和激励。 非常感谢提前。

2 个答案:

答案 0 :(得分:2)

不要使用#gsub!链接。 (实际上,对于大多数代码,根本不使用#gsub!。)

  

[gsub!]执行String#gsub 的替换,如果没有执行替换,则返回str,或nil

将代码切换到不会引起副作用的#gsub(yay!)并始终返回一个字符串(yay!) - 只需将结果与原始(未修改的)字符串进行比较。


另外,可以使用接受哈希的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!,因为我发现字符串令人不安的副作用。但是,当与上面的非链式表格一起使用时,它会可靠地工作。)

答案 1 :(得分:2)

Ruby gsub!如果不执行替换则返回nil。这意味着你不能像你一样可靠地链接它。如果你想验证任何gsub是否有任何改变,你可以链接非破坏性gsub(没有爆炸;返回一个新的字符串而不是修改当前的字符串):

input = gets.chomp
replaced = input.gsub(/s/,"th").gsub(/ce/,"th").gsub(/ci/,"th").gsub(/cy/,"th")
if input == replaced
  ...