解决方法
一个关键的区别是尝试!是一个额外的方法调用,而& ;.不是.我能想到这造成的一个(公认的做作)差异
"1234"&.gsub(/\d/,"a") $& #=> "1234"
这里没有惊喜 – 我进行了正则表达式匹配,因此设置了正则表达式全局变量($&是匹配的字符串).
但是,如果(在一个新鲜的irb会议 – 这很重要)我做
"1234".try!(:gsub,/\d+/,"a") $& #=> nil
那么正则表达式相关的全局变量是零.这是因为这些全局变量并不是全局的 – 它们与调用代码的位置相关联(文档调用此线程和方法本地全局变量)
在这种情况下,$&仍在设置,但它正在设置内!方法,所以你永远不会看到它.
额外的方法调用也使得尝试更慢(在快速基准测试中几乎是一个数量级),尽管在任何实际使用中,您调用的实际方法的成本应该使尝试的成本相形见绌!