From: SASADA Koichi Date: 2006-09-08T22:48:22+09:00 Subject: [ruby-dev:29535] Re: symbol and string  参考文献捜索中のささだです. Yukihiro Matsumoto wrote: > | String のメソッドが使えることは、多分悪いことは無いと思いますが、 > |Symbol と String は「別物」と思っています。 > | > | :foo == "foo" #=> false なので、Hash で同じキーになるのも嫌な感じで > |す。はい。 > > 今までと違う以上「イヤな感じ」を持つ人がいるのは理解できます。 > が、理由のほうに興味がありますね。こう不便だとか、こういう理 > 屈でそうあるべきでないとか。 > > akrさんは実際に動かなくなった例を示してくださいましたが、そ > れなりに(納得して?)対応してくださったようですし。  とりあえず感覚的に「ありえねー」と思うので,それじゃ理由になんないです よねぇ.  Lisp なんかでは,この辺ってどうなんでしょう.eq*? な関数でシンボルが同 じ値を返すことはあるんでしょうか. > | あと、 > | :abc.sub(/a/, 'A') #=> :Abc > |なのに、 > | :abc.succ #=> "abd" > |なのは、なんででしょう。統一するべきじゃないかと思います。 > > あ、:abc.sub(/a/, 'A')は文字列を返すべきですね。シンボルはGC > の対象にならないので、安易に生成するとすぐにシンボルテーブル > が脹れ上がる危険があるので、シンボルに対する文字列操作では文 > 字列を作るようにしています。  実は,Symbol に統一するのがいいんじゃないかと思っておりました.このコ ンテキストでは Symbol が返ってくる事をなんとなく期待しませんか? String 系のメソッドは,:sym.to_s.foo の短縮形と覚えるべきでしょうか.でも,foo が String 系のメソッドだったっけ,と覚えるのが大変そうです.  もし,これらの理由が「Symbol は GC しないから」ということなら,Symbol を GC するように検討してみるのはどうでしょうか(薮蛇かも).  今回の変更で,SPECIAL_CONST_P(sym) == 0 になったので,なんとななるん じゃないのかなー,と,なんとなく思っているんですが,甘いでしょうか.mark するところがちょっと増えるだけかな,とか思ってるんですが.うーん,Symbol にしないで ID だけ使っているものもあるので,やっぱり難しいか?  rb_intern で作ったオブジェクトと,Symbol オブジェクトとして作ったオブ ジェクトを分ける(前者には消さないフラグを着けておくとか)なんてどうか な,とか思いました.とりとめもないですが. -- // SASADA Koichi at atdot dot net