Ruby:隐式返回值如何在块中工作?

时间:2017-09-11 10:03:31

标签: ruby regex gsub

编辑:我原来的问题与我的实际问题没有关系,但是当我在这个过程中学到一些东西时,我决定改写我最初的陈述。

我想在字符串的一对括号内用替换每个空格_。这是我的示例输入:

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假设在这里返回什么的逻辑。

1 个答案:

答案 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