以下代码定义了具有正则表达式(键)和替换(值)的哈希.然后它迭代哈希并相应地替换字符串.
简单的字符串替换效果很好,但是当我需要在替换它之前计算resut(几年到几天的情况发生变化)时,它不会.并且预先定义哈希是关键.
我错过了什么?任何帮助将非常感激.
a = "After 45 years we cannot use this thing."
hash = {
/(\d+) years/ => "#{$1.to_f*2}" + ' days',
/cannot/ => 'of course we CAN'
}
hash.each {|k,v|
a.gsub!(k) { v }
}
puts a
Run Code Online (Sandbox Code Playgroud)
谢谢!
String#gsub!有两种形式,一种在其中在一个字符串传递作为第二个参数,其中相同的变量引用$1和$2由相应的子表达式匹配代替,并且一个在其中在一个块,这被称为与具有子表达式参数传递传入的匹配.您在调用时使用块形式gsub!,但是散列中的字符串正在尝试使用传入字符串的形式.
此外,字符串中的变量插值在匹配之前发生; 一旦对字符串进行求值就会发生变量插值,这是在构造散列时,为了使其工作,你需要在子表达式替换发生后进行变量插值(从来就不是这样;变量插值会发生)第一,并且生成的字符串将被传递到gsub!了gsub!替代的子表达式匹配$1,但$1在字符串中就已经进行了评估,并不再像已经发生插值).
现在,如何解决这个问题?那么,你可能想直接存储的块哈希(以便在构造散列字符串将不进行解释,而是当gsub!调用块),相应的匹配参数,并且$1,$2等绑定到适当的子表达式匹配.为了将块转换为可以存储并稍后检索的值,您需要添加lambda它; 那么你可以通过为它添加前缀来再次将其作为一个块传递&:
hash = {
/(\d+) years/ => lambda { "#{$1.to_f*2} days" },
/cannot/ => lambda { 'of course we CAN' }
}
hash.each {|k,v|
a.gsub!(k, &v)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3189 次 |
| 最近记录: |