ruby : "undefined method"错误;如何更有效地使用 gsub?

标签 ruby gsub

所以我在想办法把用户输入的唐老鸭-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/

相关文章:

ruby-on-rails - validate_presence_of 无法按预期使用增量计数器

ruby - 如何使用 Ruby 有效地匹配来自 2 个数组的数据

使用查找另一个数据帧替换一个数据帧中的文本

r - 如何在 R 中使用 gsub 从字符串中删除非数字字符?

ruby - 净 :HTTP SSL negotiation timeout on Ubuntu 14. 04

ruby - 在 Ruby 中使用 HTTPClient 重定向到非 https 资源错误

javascript - Rails - 如何正确实现支付/预订流程

regex - R从模式末尾提取子字符串直到第一次出现字符

删除 R 中以\n 或\U 开头的字符串

r - 使用 mapply 将向量中的模式替换为 tm 中向量中的替换