こんばんは,久野です。親切なご解説に感謝します。

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
------------------------------