From: KANEKO Naoshi Date: 1998-04-13T01:05:44+09:00 Subject: [ruby-dev:2256] Re: sub for sjis 金子です。 プログラムの作成は ruby-list の話題だったと、いまさら気が付きま したが、仕様の疑問点とかもでてきたので、このまま ruby-dev で 話をつづけさせていただきます。 In message "[ruby-dev:2253] Re: sub for sjis" on Sun, 12 Apr 1998 23:56:55 +0900, shugo@po.aianet.ne.jp (Shugo Maeda) writes: まず、前田さんのアドバイス通りやりましたら、あっさり動くようにな りました。 前田さん、ありがとうございました。 shugo> |shugo> イテレータブロックを他のイテレータに渡すには&を使います。 shugo> shugo> 実はつい最近追加された機能です(^^; これは便利ですね。 イテレータがある場合もない場合も、特に気にせずに、まとめて 別のメソッドに渡せてしまうのは感動しました。 話はかわりまして、新たにでてきた疑問点、質問なのですが、 1. sub のイテレータ変数(?)の値が、 ruby>'abc'.sub('b') {|c|} "ac" ruby>'abc'.sub('b') {|c|c=c} "abc" このように c=c としなければ元の値が保持されないのは仕様 なのでしょうか? c には既に値が入っていることが分かっているのに何もしないと 値が消えてしまうのはちょっと疑問です。 2. パラメタが2つで、かつ、イテレータがあるとき、 ruby>'a'.gsub('a', 'b') {|c| c = 'z'} "b" のようにイテレータを無視して動作します。 これは、"Wrong # of arguments (2 for 1)" のエラーとなっても いいように思えます。 3. jcode.rb を参考にして、オリジナルメソッドを private で隠そうとしたのですが、 下のコードの # private :original_gsub # private :original_gsub! の行のコメントをはずすと、 ruby> 'a'.gsub('a', 'b') ERR: ./jj.rb:14:in `gsub!': undefined iterator `original_gsub!' for "b" のようなエラーとなります。(jj.rb は下のコードの定義) この場合 original_gsub と orignal_gsub! は private にはできない ものなのでしょうか? 意味がわかる方がいましたら教えてください。 以上3点です。 質問ばかりでもうしわけありませんが、よろしくお願いします。 ---- shift-jis対応 gsub ----------------------------------------- class String alias original_gsub gsub alias original_gsub! gsub! # private :original_gsub # private :original_gsub! def gsub!(from, *args, &block) if (args.size != 1) self.original_gsub!(from, *args, &block) else to = args[0] if $KCODE =~ /^s/i && to to.original_gsub!(/./) do |s| if s[1] == 0x5c s += '\\' end s = s end end self.original_gsub!(from, to) end end def gsub(from, *args, &block) self.dup.gsub!(from, *args, &block) end end -- 金子 尚史 (KANEKO Naoshi) wbs01621@mail.wbs.or.jp