Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 鲁比,潜艇!方法在字符串数组中的元素上生成意外结果_Ruby_Arrays_String_Methods - Fatal编程技术网

Ruby 鲁比,潜艇!方法在字符串数组中的元素上生成意外结果

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",

我正在尝试使用.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", "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。不过我还是建议你单独问一个问题。