From: KURODA Hiraku Date: 2008-01-26T21:50:29+09:00 Subject: [ruby-dev:33410] Re: wrapped String#gsub こんばんは、黒田ひらくと言います。 メソッドに渡したブロックの$1, $2は、そのブロックを作ったスコープのもののようです。 ---- #!/usr/bin/ruby class String def wrap_gsub(re, &b) self=~re # => このマッチのデータはbの中の$1に反映されない self.gsub(re, &b) end end "abc,abc"=~/([a]+)/ "abc,abc".wrap_gsub(/([abc]+)/) { puts $1 } # => 上の行のマッチのデータが$1に入る ---- 実行すると ---- ~$ ruby -v test.rb ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux] a a ---- となります。 ブロックの中でブロックを実行するメソッドのマッチのデータを使いたい場合ですが、ブロックのパラメータ に$&を渡すのはいかがでしょうか? ---- ソース #!/usr/bin/ruby class String def wrap_gsub2(*a) self.gsub(*a){yield($~) if block_given?} end end "abc,abc".wrap_gsub2(/(a)(bc)/) {|m| puts m[0], m[1], m[2] } ---- ---- 出力 $ ruby -v test.rb ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux] abc a bc abc a bc ---- Park Ji-In さんは書きました: > 朴 芝印です。 > すみません。説明が足りなかったので申し訳ございません。 > > 改めて書いてみます。 > > class String > def wrap_gsub(*a, &b) > self.gsub(*a, &b) > end > end > > puts "wrapper" > "abc,abc".wrap_gsub(/([abc]+)/) { puts $1 } > puts "original" > "abc,abc".gsub(/([abc]+)/) { puts $1 } > > -- 結果 -- > > wrapper > nil > nil > original > "abc" > "abc" > > です。gsubをblock付きで呼ぶときは検索できたもじれつは > $1, $2などで渡すと書いてありました。 > > が、こんな風にblockを渡してdeligator見たいな真似を > することは出来ないでしょうか。 -- -------------------------------------------------- 黒田 拓(くろだ ひらく) hiraku@sapporo.email.ne.jp http://www.hinet.mydns.jp/ --------------------------------------------------