为什么这个.each_char方法不会替换指定的字符?

时间:2014-02-22 21:10:10

标签: ruby string gsub

这是一个简单明了的问题。在下面的代码中,这应该替换用下划线指定的字符,但事实并非如此。我查看了.each_char和.gsub的文档,这个组合应该可行。为什么这段代码不起作用?

string = "string"
new_string =string.each_char do |char|
  if char == "i"
    string.gsub(/char/,"_")
  end
end
  

put new_string

上面的代码应输出“str_ing”。正确?

2 个答案:

答案 0 :(得分:1)

第一个问题是在正则表达式中使用char。您使用的char不是变量而是文本。第二个问题是在块内定义一个新字符串:

string = "string"
string.each_char do |char|
  if char == "i"
    new_string = string.gsub(/#{char}/,"_")
  end
end

答案 1 :(得分:0)

代码有几个问题。

首先,正则表达式/char/正在查找文字字符char,而不是变量的内容。你可能想要的是/#{char}/,它评估char并创建一个包含其内容的正则表达式。

接下来,查看gsubgsub!之间的区别。您正在使用的gsub创建一个 new 字符串。在你的块里面你创建一个新的字符串,但是不要对它做任何事情。它基本上被扔掉了。

each_char method在将每个字符输出到块后返回原始字符串。块中的字符串不会更改,因此最后它不会更改。如果您使用gsub!代替gsub,则会看到您的预期,因为原始字符串已被更改。

但是,不要这样做。通常,在迭代它时,不应该操纵这样的数据结构。在这种情况下它可以正常工作,但它不是你应该进入的习惯。您无法确定您的操作将如何影响迭代,并且最终可能会出现意外结果或错误。

在这种情况下,您可以单独使用gsub!

new_string.gsub!(/i/, '_')