编辑:我原来的问题与我的实际问题没有关系,但是当我在这个过程中学到一些东西时,我决定改写我最初的陈述。
我想在字符串的一对括号内用替换每个空格
_
。这是我的示例输入:
This is my string (nice, isn't it?). It can have various types [of input].
期望的输出:
This is my string (nice,_isn't_it?). It can have various types [of_input].
我有以下代码:
my_string = my_string.gsub(/\([^\(\)]+\)|\[[^\[\]]+\]/) { |bracketed|
bracketed.gsub(/ /, '_')
}
为什么bracketed.gsub(/ /, '_')
等于bracketed = bracketed.gsub(/ /, '_')
?这与gsub!
有什么不同?我并不完全理解Ruby假设在这里返回什么的逻辑。
答案 0 :(得分:2)
为什么
margin-left: auto
等于bracketed.gsub(/ /, '_')
?这与bracketed = bracketed.gsub(/ /, '_')
有什么不同?
gsub!
会返回新字符串。gsub
更改 现有字符串。所以gsub!
和bracketed = bracketed.gsub(/ /, '_')
非常相同。
(只有次要行为差异,如果没有匹配模式,bracketed.gsub!(/ /, '_')
将返回gsub!
。无论哪种方式,你都会改变原来的nil
1}}变量以相同的方式。)
然而,你问的是错误的问题......让我们再看看你的原始代码,可以写成:
bracketed
来自the documentation for String#gsub
:
在块形式中,当前匹配字符串作为参数传递[...] 块返回的值将替换每次调用时的匹配。
在ruby中,方法/块中的最终评估行是其隐式返回值。你在这里所做的只是将值传递回原来的my_string.gsub!(/\([^)]+\)|\[[^\]]+\]/) do |bracketed|
bracketed.gsub(/ /, '_')
end
方法; 无关紧要您是否变异/重新分配gsub
变量。
也许这个例子会让事情变得更加清晰:
bracketed