我正在尝试使用.sub!在一个字符串数组中的元素上,得到“怪异”的结果。 这是1.8.7&在2.1.5 看看irb日志。 .SUB!不会做我所期望的,但.sub会做,并且原始价值......
irb(main):001:0> k = ['1','2']
=> ["1", "2"]
irb(main):002:0> k[-1].sub!( /(\d+)/, (($1).to_i + 1 ).to_s() )
=> "1"
irb(main):003:0> k
=> ["1", "1"]
irb(main):004:0> k[-1] = k[-1].sub( /(\d+)/, (($1).to_i + 1 ).to_s() )
=> "3"
irb(main):005:0> k
=> ["1", "3"]
答案 0 :(得分:2)
它与sub
vs sub!
无关。
在第一个表达式中,$1
引用了匹配的上一个正则表达式的第一次捕获。在这种情况下,这意味着它可能是零,然后变为0,你加1。
在第二个表达式中,$1
再次引用第一个捕获,即2.如果再次运行该行,它将保持1,并且您将获得意外结果。< / p>
就此而言,您似乎正在寻找的是一个块:
k[-1].sub!(/\d+/) { |i| (i.to_i + 1).to_s }