我正在学习 Ruby (2.0),这让我很惊讶:
s = "1234"
s =~ /\d+/
$& ==> "1234" # as expected, $& contains the matched string
$&.slice!(-2..-1) # should mutate string
$& ==> "1234" # what?
s.slice(-2..-1)
s ==> "12" # as expected
该slice!
方法应该改变字符串。其他 mutator 方法的行为方式相同。我的问题:为什么这不会引发错误,这是我所期望的,当一个函数不能做它说它会做的事情时?这是在某处记录的吗?有道理吗?
更新
所以,我看到它$&
不像一个全局变量。对它的每个引用都会给出一个新对象,就好像它真的是一个无参数函数一样:
irb> $foo = "1234"
=> "1234"
irb> $foo.object_id
=> 70205012205980
irb> $foo.object_id
=> 70205012205980 # the same
irb> $&.object_id
=> 70205003531300
irb> $&.object_id
=> 70205011619040 # different object
所以......我的问题变成了:这只是解释器的“魔法”,还是$&
实际上是一个无参数函数,就像我可以在 Ruby 中使用def ... end
? 而且,我怎么能分辨出来呢?foo
在 Python 中,我可以通过使用它的名称来引用一个函数:
>>> foo
<function foo at 0x10d3117d0>
有没有办法在 Ruby 中做到这一点?然后我可以看看 $& “真的”是什么(如果它不是魔法的话)。