Ruby 鲁比,潜艇!方法在字符串数组中的元素上生成意外结果
我正在尝试使用.sub!在字符串数组中的元素上,并得到奇怪的结果。 这在1.8.7和2.1.5中都有 看看irb日志。附属的!不做我所期望的,但是.sub做了,而且对于原始值Ruby 鲁比,潜艇!方法在字符串数组中的元素上生成意外结果,ruby,arrays,string,methods,Ruby,Arrays,String,Methods,我正在尝试使用.sub!在字符串数组中的元素上,并得到奇怪的结果。 这在1.8.7和2.1.5中都有 看看irb日志。附属的!不做我所期望的,但是.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",
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"]
它与sub vs sub!无关
在第一个表达式中,$1引用了之前匹配的正则表达式的第一个捕获。这意味着,在本例中,它可能是nil,然后变成0,再加上1
在第二个表达式中,$1再次引用第一个捕获,即2。如果您再次运行该行,它将保持1,您将得到意外的结果
在这一点上,您似乎在寻找一个区块:
k[-1].sub!(/\d+/) { |i| (i.to_i + 1).to_s }
现在进入下一个问题,如果正则表达式有一些beackreference,会发生什么?我在这里举了一个简单的例子,但我可能只想访问替换字符串中的backreferec值…您可以使用\1、\2等:sub/\d+/,\0。不过我还是建议你单独问一个问题。