From: Shugo Maeda Date: 1999-02-09T20:00:12+09:00 Subject: [ruby-dev:4915] Re: to_i,to_s の素朴な疑問 前田です。 # もう安井さんは納得されたようなのであまり意味はないかもしれませんが、 # 一応確認のためということで。 HQss_YasuiS/hq_ss@omssv.hq.hitachizosen.co.jp writes: > >> 1 + 2 * 3 => 7 #ruby風 > >> 1 + 2 * 3 => 6 # Smalltalk風(これが不自然だと) > > > >仮にSmalltalk風の優先順位だったとしても、Numeric+String->Numericが > >合理的であるということにはならないと思うのですが。 > > そうですか。観点の違いかも。数学的観点に近い程理解は容易かな。 例えば、 class Numeric def add(other) ... end end のように演算子でない普通のメソッドだったとしても、今のRubyのポリシー から考えると、引数にStringは認めないような仕様になると思います。 で、演算子の優先順位の問題と切り離して考えると、引数にStringを認めない 仕様自体はオブジェクト指向的でないとは言えないように思います。 > 私の知ってる古いSmalltalkでは、文字列の結合もなかったような?・・です。 > でも、基本クラスがオープンなのである程度自由に書き換えられます。 Rubyでも自由に書き換えられます:-) Rubyでは既存のクラスを実行時に書き換えることができるので、 for klass in [Fixnum, Bignum, Float] klass.module_eval %q{ alias __plus + def +(other) case other when String return __plus(other.to_i) else return __plus(other) end end } end のようにすれば、ほぼ安井さんのご希望通りの動作になると思います。 # ただ、他の人がソースを読む場合などを考えると、あまりおすすめ # できる方法とは言えませんけれど...。 > >ただし、marshalingは"123"<->123のような変換を行うものではありません。 > >安井さんのメールを読むと"123"<->123のような変換とmarshalingを混同なさ > >っているように思われます。 > > そうですか。よく勉強してみます。 やってみればすぐわかるのですが、to_sが"123"のように数値の文字列表現を返す のに対して、Marshal::dumpは、 $ irb irb(main):001:0> s = Marshal.dump(123) "\004\000i\001{" irb(main):002:0> Marshal.load(s) 123 のように一見わけのわからない文字列を返します。 この文字列はMarshal::loadによって、元のオブジェクトに復元できるようなデータ になっていますが、人間が読むようには作られていません。 Marshalが使われるのはオブジェクトをパーシスタント・ストレージ(日本語で何と 訳すのかわかりません(^_^;)に保存したり、ネットワークでオブジェクトのやりとり をするような場合です。 packの場合は保存する形式を明示的に指定する必要があるので、単にオブジェクトを 保存したい場合にはMarshalの方が楽かもしれません。 > >普通、pure/hybridの区別ははすべてのデータがオブジェクトかどうかという > >ことによると思うのですが、安井さんはpure/hybridをどのように区別なさっ > >ているんですか? > > 区別って? どう答えればいいのでしょう。 うーん、別に無理に答えていただく必要はないのですが、もともと僕がPython ではなくRubyを選んだのは、すべてのデータがオブジェクトになっているpure なOOPLだから、という理由がかなり大きいので、Rubyはhybridだと言われると ちょっとくやしいわけです。 # よく考えたら僕がくやしがることでもないのですけれど(^_^; -- 前田 修吾 (mailto:shugo@netlab.co.jp)