这是一个简单明了的问题。在下面的代码中,这应该替换用下划线指定的字符,但事实并非如此。我查看了.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”。正确?
答案 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
并创建一个包含其内容的正则表达式。
接下来,查看gsub
和gsub!
之间的区别。您正在使用的gsub
创建一个 new 字符串。在你的块里面你创建一个新的字符串,但是不要对它做任何事情。它基本上被扔掉了。
each_char
method在将每个字符输出到块后返回原始字符串。块中的字符串不会更改,因此最后它不会更改。如果您使用gsub!
代替gsub
,则会看到您的预期,因为原始字符串已被更改。
但是,不要这样做。通常,在迭代它时,不应该操纵这样的数据结构。在这种情况下它可以正常工作,但它不是你应该进入的习惯。您无法确定您的操作将如何影响迭代,并且最终可能会出现意外结果或错误。
在这种情况下,您可以单独使用gsub!
:
new_string.gsub!(/i/, '_')