あれ?2009/07/09

Kernel.gets あたりのメソッド(いわゆる組み込み関数)が 組込み変数$_ を更新したり参照するマニュアルにも明記されて挙動の他に、 ローカル変数_ を更新しているっぽいのですが、これの挙動ってどこかに記述されていましたっけ?

irb(main):001:0> gets
foobar
=> "foobar\n"
irb(main):002:0> $_
=> "foobar\n"
irb(main):003:0> _
=> "foobar\n"

gsubとかでも更新されます。

irb(main):004:0> gsub("o", "u")
=> "fuubar\n"
irb(main):005:0> $_
=> "fuubar\n"
irb(main):006:0> _
=> "fuubar\n"

変数として $_ と _ は別物らしい

irb(main):007:0> _ = nil
=> nil
irb(main):008:0> $_
=> "fuubar\n"

いわゆる組み込み関数の類が参照しているのは $_

irb(main):008:0> $_
=> "fuubar\n"
irb(main):009:0> _
=> nil
irb(main):010:0> gsub("u", "o")
=> "foobar\n"
irb(main):011:0> $_
=> "foobar\n"
irb(main):012:0> _
=> "foobar\n"

1.8.7 と 1.8.5で確認。

ゴルファー的にはいつか役に立ちそうな挙動だけど、なんか気持悪い。