私は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!
メソッドは、文字列を変更することになっています。他のミューテーター メソッドも同じように動作します。私の質問: なぜこれがエラーをスローしないのですか。これはどこかに文書化されていますか?根拠はありますか?
アップデート
$&
つまり、グローバル変数のように機能していないことがわかります。それへの各参照は、あたかも本当に引数のない関数であるかのように、新しいオブジェクトを与えます:
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
ですか? そして、どうすれば違いを見分けることができますか?Python では、foo
名前を使用するだけで関数を参照できます。
>>> foo
<function foo at 0x10d3117d0>
Rubyでこれを行う方法はありますか? 次に、 $& が「本当に」何であるかを確認できます (魔法ではない場合)。