From: HQss_YasuiS/hq_ss@... Date: 1999-02-10T17:47:09+09:00 Subject: [ruby-dev:4970] Re: to_i,to_s の素朴な疑問 安井です。 >前田です。 ># もう安井さんは納得されたようなのであまり意味はないかもしれませんが、 ># 一応確認のためということで。 はい。わかりました。 >例えば、 >class Numeric > def add(other) ... end >end >のように演算子でない普通のメソッドだったとしても、今のRubyのポリシー >から考えると、引数にStringは認めないような仕様になると思います。 おっしゃっている意味がわかりません。 それと、通常のメソッドを採用した場合、多項式は左から順に評価されるしか ないですよね。つまり、 1.add(2).mult(3) =>7 にはならないだろうということです。 >で、演算子の優先順位の問題と切り離して考えると、引数にStringを認めない >仕様自体はオブジェクト指向的でないとは言えないように思います。 はい。おっしゃる通りです。 引数にStringを認めるか否かは「クラス設計上の問題」であってOOPとは 直接関係ありません。 >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 >のようにすれば、ほぼ安井さんのご希望通りの動作になると思います。 ええ。回避策があるのは分っていました。 前田さんのような高度な方法ではありませんが、私の場合はNumericの サブクラスを作ればよいのではと考えていました(うまくいくかは別問題)。 ># ただ、他の人がソースを読む場合などを考えると、あまりおすすめ ># できる方法とは言えませんけれど...。 同感です。不自然でコジツケみたいですね。こんなのは絶対止めましょう。 >やってみればすぐわかるのですが、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が使われるのはオブジェクトをパーシスタント・ストレージ(日本語で何と >訳すのかわかりません(^_^;)に保存したり、ネットワークでオブジェクトのやりとり >をするような場合です。 詳しいご説明を頂き感謝します。 そうですね。Marshalは使用目的によっては不便を感じる場合がありそうですね。 ただおっしゃっておられるようにネットワーク上でオブジェクトを転送する場合には 有効かと思います。 >packの場合は保存する形式を明示的に指定する必要があるので、単にオブジェクトを >保存したい場合にはMarshalの方が楽かもしれません。 なるほど。よく分りました。 で、説明して頂いた次いでなんですが、Mashalやpack/unpackの便利な用例など ご存知なら教えて頂けませんか? >うーん、別に無理に答えていただく必要はないのですが、もともと僕がPython >ではなくRubyを選んだのは、すべてのデータがオブジェクトになっているpure >なOOPLだから、という理由がかなり大きいので、Rubyはhybridだと言われると >ちょっとくやしいわけです。 Pythonは名前しか知らないのですが、お聞きする範囲ではRubyより手続き指向より の印象を持ちます。 私は、しばらく前までPerlを使っていましたが、Rubyの存在を知ってから乗換中? です。PerlとRubyは近い部分もありますが、Perlは何故かコードが汚く見えます。 変数の頭の$記号のせいでしょうかねえ?でも、Perlでオブジェクト指向風に記述 できない訳じゃないので、今後、言語仕様が改善されれば、Rubyにとってさらに 脅威的になるかも知れませんね(そうならないことを祈るが)。 私がpureなOOPLと思うのはSmaltalk/V(Smalltalk-80のPC版?)です。Rubyとは 比べ物にならないくらいpureです。バーチャルマシンと幾つかの基本クラス、あと、 チュートリアルなどで構成される非常にシンプルなOOPLです。 いや、OOPLというより、OOPSかOOOSと呼ぶ方が相応しいかも。しかも、これらが FD1枚に収まっているのです。まさに驚異的です。 # でも1つ不満があって、それは Script言語でない、ってとこかな。 Smalltalk/Vからみると、Rubyは、関数ありの、モジュールありのとてもpureと呼べ るものではありません。 しかし、まさにそれこそがRubyのRubyたる所以でしょう。つまり、pureでないことは、 逆にRubyの強みになっているのです。 Rubyがオブジェクト指向として、スクリプトとして、先行するPerlに対抗するための 唯一の手段。それが、Ruby の Hybrid化 ではなかったかと(self.想像しすぎだぞー)。 ># よく考えたら僕がくやしがることでもないのですけれど(^_^; いえいえ。 Rubyを愛してらっしゃることがよく分ります。(^^) ------ yasuisu@omssv.hq.hitachizosen.co.jp