Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么.each_char方法不替换指定的字符?_Ruby_String_Gsub - Fatal编程技术网

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

Ruby 为什么.each_char方法不替换指定的字符?,ruby,string,gsub,Ruby,String,Gsub,这是一个简单明了的问题。在下面的代码中,这应该用下划线替换指定的字符,但事实并非如此。我已经查看了这两个的文档。每个_char和.gsub以及这个组合都应该可以工作。为什么这段代码不起作用 string = "string" new_string =string.each_char do |char| if char == "i" string.gsub(/char/,"_") end end 放入新的字符串 上述代码应输出“stru_ing”。对吗?第一个问题是在正则表达式中

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

string = "string"
new_string =string.each_char do |char|
  if char == "i"
    string.gsub(/char/,"_")
  end
end
放入新的字符串


上述代码应输出“stru_ing”。对吗?

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

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

代码有几个地方出了问题

首先,正则表达式
/char/
查找的是文本字符
char
,而不是变量的内容。您可能需要的是
/#{char}/
,它计算
char
并创建一个包含其内容的regexp

接下来,看看和之间的区别
gsub
,这是您正在使用的,它会创建一个新字符串。在块内创建一个新字符串,但不要对其执行任何操作。它基本上被扔掉了

将每个字符产生到块后,返回原始字符串。该字符串在块中没有更改,因此在最后它是不变的。如果您使用了
gsub
而不是
gsub
您将看到您所期望的内容,因为原始字符串已更改

但是,不要这样做。一般来说,在对数据结构进行迭代时,不应该像这样操作它。在这种情况下,它可以正常工作,但这不是一个你应该养成的习惯。您无法确定您的操作将如何影响迭代,最终可能会出现意外的结果或错误

在这种情况下,您可以使用
gsub本身:

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

谢谢你们,我想我现在拿到了。我感谢你的回答,尤其是解释。