こんばんは,久野です。親切なご解説に感謝します。 on Mon, 26 Feb 2001 20:22:12 +0900 in [ruby-list:28318] Re: [Q] jcode の局部適用 <20010226202753W.aamine / mail.u-netsurf.ne.jp> Minero Aoki <aamine / dp.u-netsurf.ne.jp> wrote: > 1 クラス名みたいに見えるのはただの定数だ > 2 オブジェクトはそれぞれ自分が所属するクラス(オブジェクト)を > 記憶している (名前を覚えているのではない)。それは生成時に > 決定し、それ以後は変わらない。 なるほど,よく分かりました。前者の事実は全く失念していました。 後者も言われてみれば納得できます。 > > (2) String#new("") と "" はどちらもStringクラスのインスタン > > スを返すはずなのに,s4とs5の結果が異なるのはなぜ? > > '' のように書くと、Ruby インタプリタは > > 実行開始時に定数 String に入っているクラス(オブジェクト) > > を別に持っていて、常にそれを使います。つまり定数 String の指す先が > 変わろうと全く無関係です。一方 String.new('') と書くと > > その時点で定数 String に入っているクラス(オブジェクト) > > がクラスになります。 これは知りませんでした。 さて,今度はこんな実験をしてみました。 #!/usr/local/bin/ruby -Ke s1 = '松本' s2 = '硝' original_String = String String = original_String.clone require 'jcode' s1 = String.new( s1 ) # s1のクラスを一時的に変更 puts s1.delete s2 # 日本語を意識した処理 String = original_String s1 = String.new( s1 ) # s1のクラスを元に戻す puts s1.delete s2 # デフォルトの処理 __END__ Stringに二度目の代入をするところで警告が出ますし,少々面倒か つ '' 記法ではjcodeが適用されないなどの制限もありますが,そ れさえ無視すれば思惑通り,グローバルな挙動を変更せずに済みま す。個人レベルで使う分にはまず問題なさそうです。 それにしても,定数に代入できてしまうとは知りませんでした。こ の仕様(警告only)は今後も継続されるのでしょうか。個人レベル のスクリプトでクラス定義をまるまる退避&復元したいことは結構 ありそうなので,こうした手法を使ってみたいのですが。 ------------------------------ 久野 宏三 (HISANO Kozo) mailto:mail / seventhree.com ------------------------------