我有一串数字和字母交替.我想用前面的字母数替换每个字符.例如,2a3b
应该返回aabbb
.
首先,如果我这样做:
"2a3b".scan(/(\d)(.)/) do |count, char| puts char * count.to_i end
我明白了:
aa bbb
但是,如果我这样做:
"2a3b".gsub(/(\d)(.)/) do |count, char| char * count.to_i end
我收到一个错误:
NoMethodError: undefined method `*' for nil:NilClass
它们不应该都表现相同(更新:我的意思是,接受捕获组作为块参数)?
更新 :(解决方法,有效)
"2a3b".gsub(/(\d)(.)/) do |match| $2 * $1.to_i end
收益:
"aabbb"
正如所料.
不,他们的行为不一样.gsub的块形式只接受一个参数,所以第二个将是nil,因此你的错误.见http://ruby-doc.org/core-2.1.4/String.html#method-i-gsub
使用示例: "hello".gsub(/./) {|s| s.ord.to_s + ' '}
在块形式中,当前匹配字符串作为参数传入,并且将适当地设置诸如$ 1,$ 2,$`,$&和$'的变量.块返回的值将替换每次调用的匹配.
结果继承了原始字符串或任何提供的替换字符串中的任何污点.