From: HQss_YasuiS/hq_ss@... Date: 1999-02-08T15:55:47+09:00 Subject: [ruby-dev:4829] Re: to_i,to_s の素朴な疑問 安井です。 ruby-dev に初めてポストします。内容は ruby-list からの継続です。 返事がおそくなりました。実は、今朝、会社のメール配送にトラブル? があり、このメールはWebからコピーして書いています。(何と、前後 のメールは来ているのに、このメールだけまだなのです!) >|> (1) +という演算子形式のメソッド >|数学的法則といっても、Numeric と String では意味が異なりますよね。 >NumericとStringで意味が異なるで構いませんが,混在した時にど >のような意味を与えるかはまた別の話ではないですか.で,私とし そうですね。 >ては +という演算子は数学記法から借りてきたので,両辺いずれか >に数値を含む場合には数学的な雰囲気を持たせたいなと思っていま >す."1"+1 => 11 だとそれが崩れちゃいますねえ. おっしゃるとおりです。 でも、数学的な雰囲気を持たせることをキープするなら、 + メソッドは Numeric だけに限定すべきですよね。 そうなると、いまのrubyでは Stringクラスの + メソッドの方は捨てなけ ればならなくなりませんか? Perlが + でなく . を採用しているのもその辺りも考慮しているのかも 知れません(Perlでは文字列に+を使うと数値に変換される)。 >|> (2) 引数による多態性 >|それと「乱用というのは引数の型の自動変換に相当するような多態性は >|「型の認識」を阻害する」という個所は何を想定されているのでしょうか? >えーと,「右辺(または引数)の型が数値であっても文字列であって >も構わない」というのは「構わない」と思う時点で「型の認識を阻 >害する」と思うのですが,私の考えは違ってます? ここで言う「型が何であっても構わない」とは、合理性を伴った「構わない」 という意味で、当然、そのクラスに相応しい、かつ、必要なメッセージでな ければならないことは言うまでもありません。 それと、はっきりと区別しておかなければならないのは、引数の多態?(こんな 言葉があるかどうかは別にして)は、rubyインタープリタの仕様と言うより クラス設計論の問題ではないですか。さらに、まつもとさんは認めるか否かに 係わらず、既に添付ライブラリやユーザが自由に作成するクラスにおいて、 バンバン作られているじゃないですか。 本来なら標準クラスは、インタープリタと1枚岩にするのではなく、添付ライブ ラリのように切り離してruby語で作成し、一般のrubyユーザにも開放して欲しい と思っています(これは単なる意見です。聞き流してください)。 >えーと,私の考えでは,すくなくともRubyにおいては仕様というの >は「仕様だから仕様である」のではなく,「気持ち良い,あるいは >間違いが発生しにくいので仕様としよう」であるべきだと考えてい なるほど。よくわかります。でも今回のケースは該当しませんよね。 >ます.んで,現状の挙動を変更するためには「こうであっても良い >じゃないか」ではなく,「こうあるべきだ」と攻めてほしいですね. >少なくとも現時点ではその方向のアプローチが不足していると思い >ます. わかりました。現時点で私が考える案は次の通りです。 # でも、1は多分無理かなあ 1.ストリームからデータを読むとき少なくとも、String、Numeric   が区別できること(これができれば2は不要です)。 2.1が駄目な場合、Numericの+メソッド引数に、Stringも認める。 >|で、折衷案になるかどうかわかりませんが、 >|1)Stringはそのまま変えない。 >|2)Numericには認める。 >|具体策はいろいろ意見を聞いてから、ということで如何? 異議ありですか? > >もし,万が一変えるならむしろ逆でしょう. > > "1" + 1 > >が"11"になるのはまだ妥協できますが,1+"1"が2になるのはちょっ >とかんべんです.1+"foo" とか 1+"25歳" とか考えたくもないです. ここは意見が分かれるところです。 "1" + 1 のようなケースは、もともと需要が少ないと考えます。理由は、上で のべた通り、ストリームからリードした場合、Stringとしてしか読めないので そのまま引数にできます。また、プログラムの中で引数を定義する場合は、元から Stringで行えばよい訳ですから。 1+"foo" や 1+"25歳" の出現を心配されているようですが、これらの引数は 「数値を表さないString」として区別すればすむ話ではありませんか。 対象とするStringは飽くまでも変換したとき無次元(No dimension)となるもの に限定しその他はエラーで弾けばいいと思います。 >はあ,そうですか.どうしてそこでひっかかると引数の多態に到達 >しちゃうんでしょう.まあ,面倒というのは重要な動機ではありま 面倒だけが理由ではありません。上の内容と重複しますが、 ファイルストリームからのデータリードは、Stringとしてしか受け付けられないので、 本当は数値なのに、NumericでなくStrirngで読み込まれます。そのデータを数値として 引数に与えようとした場合、その時点で、to_iを使ってNumericに変換しなければなり ませんよね。これが不自然であり非合理的じゃないか、と言っているのです。面倒なのは これを回避しようとすると、サブクラスを定義しその都度requireしなれればならない ことです。こちらの方が不自然です。 >すが,今回に関してはメリット・デメリットをちゃんと評価すると >トータルでマイナスが多そうだというのが今の私の結論です. 全く理解できませんね! - - - - - - 安井@日立造船 e-mail: yasuisu@omssv.hq.hitachizosen.co.jp # 「数値」を表す「文字列」を、「数値」として扱いたいと考えるのは自然だと思う。