我写了以下代码:
user_input
我发现user_input.gsub!(/s/,'th')
和gsub
包含相同的值。这是因为print "Changing #{user_input} to "
print "#{user_input.gsub!(/s/,'th')}"
上的爆炸操作,因为它们是同一个字符串的一部分。
将打印分成两行会改变行为:
{{1}}
我想知道这是不是一个错误。
答案 0 :(得分:3)
这是一个功能,而不是一个错误。
字符串插值("#{}"
运算符)通过查找所有动态部分,评估它们然后将静态和动态部分粘合到一个字符串中来工作。由于在连接之前评估所有动态部分,gsub!
会改变user_input
指向的对象。因此,该字符串中inner_page
的第一次出现将看到更新的值。
解决方案:请勿使用危险gsub!
,请使用安全gsub
。
您可以在此处观察真正如何发生(VM指令)。现在这对你来说可能是中国人,但几年后你就明白了。 :)
code = <<-RUBY
user_input = 'blah'
print "Changing \#{user_input} to \#{user_input.gsub!(/s/,'th')}"
RUBY
puts RubyVM::InstructionSequence.new(code).disasm