Ruby爆炸奇怪的行为

时间:2015-10-28 12:38:54

标签: ruby

我写了以下代码:

user_input

我发现user_input.gsub!(/s/,'th')gsub包含相同的值。这是因为print "Changing #{user_input} to " print "#{user_input.gsub!(/s/,'th')}" 上的爆炸操作,因为它们是同一个字符串的一部分。

将打印分成两行会改变行为:

{{1}}

我想知道这是不是一个错误。

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

disasm