パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

まつもとゆきひろ 答える」記事へのコメント

  • by Anonymous Coward on 2003年03月15日 1時04分 (#279048)
    大好きな Ruby で唯一残念なのは 3.0/2 と 3/2 の値が違うこと。というか / の定義が一貫していないこと。これって型のない言語としては surprise なことだと思う。
    • 型があるC言語でもその2つの演算の結果は違いますね。
      親コメント
      • by Anonymous Coward
        書き込みの内容わかってないなあ
        • ああ、すみません。おっしゃる通り、
          これって型のない言語としては surprise なことだと思う。
          の部分を理解出来ていませんでした。僕のミスです。

          で、元のコメントに話を戻しますと、Rubyには型が無いわけではなく、「変数に型宣言が不要」というだけで、値には型があります。なので3.0は実数、3は整数で別物と考えられますし、そうすれば不自然な感じはしないんじゃないかと思います。
          親コメント
          • by Anonymous Coward
            3.0 は Float, 実数は Rational ではないかと。
          • by Anonymous Coward
            変数に型がないから不自然ということなのでは? つまり a/2 の値が a の中身の型によって変化してしまうのは変(surprise)だと。
          • by Anonymous Coward
            要するに「割り算」には普通の除算と整除(除算のfloor)の二種類があるにも関わらず、Cでの / の定義は両方の意味がごちゃまぜになっている。ただ、Cの場合は変数の型が固定なので問題は起きない。

            しかし、変数の型が動的に変わる言語がこれを踏襲すると混乱の元となる。float も integer も現れうる文脈では x/y と書くことが許されなくなり、場合によって(Ruby風に書けば)x.to_f/y もしくは (x/y).to_i という書き方を強要される。もし、/ がどちらかの意味にまとめられていれば、どちらか

            • by Digitune (119) on 2003年03月16日 17時39分 (#280193) ホームページ 日記
              はーそういうことが問題になっているとはこれまでまったく知りませんでした。ただ、Ruby (や C++ など) の場合って、演算子もオブジェクトのメソッドとして定義されているんですよね?だとすると、そのオブジェクトにタイプによって演算子の挙動が変わるのはごく当然な気がするのですが…。つまり、

              > ここで問題なのは同じ記号(メソッド)に異なる二つの意味を与えてしまっていることであって

              という問題を本質的に回避するためには Java のように演算子オーバーロードを無くすしかないのではないかと。演算子を中心に見るか、class を中心に見るかの差、かなぁ。Java の場合、いわゆる算術演算子は String 型の一部の例外を除けばその適用範囲はプリミティブタイプに限られており、オブジェクトを直接操作するためには利用できない点で上記のような問題は意識されにくくなっているのだと思います。
              --
              Only Jav^Hpanese available :-)
              親コメント
              • by Digitune (119) on 2003年03月16日 17時51分 (#280200) ホームページ 日記
                むぅ。自分で書いといてなんですがこれは誤解ですな。

                > そのオブジェクトにタイプによって演算子の挙動が変わるのはごく当然な気がするのですが

                「演算子」で考えるといろいろ変な先入観が入ってしまいそうですが、「メソッド」で考えれば上記はちっとも「ごく当然」ではないですね。

                例えばあるオブジェクトの div メソッドの戻り値が float 型なのに別のオブジェクトの div では int で返ってきたりしたらコードを書く人は結構混乱しそう。そういう意味で「同じメソッドには同じ意味を与えるべき」という主張は全くその通りだと思います。

                行って戻って結局何も言ってないことと同じになってしまいました。すみません。
                --
                Only Jav^Hpanese available :-)
                親コメント
              • by Nayuki (8153) on 2003年03月16日 23時27分 (#280366)
                うーむ。

                オブジェクトの型が違えば同じメソッドに対して 違う型の値が返ってくるのは当然のような気がするんですけどねぇ。

                この手の話題の根拠としてよく挙げられる数学に於いても、
                (実数) / (整数) = (実数)
                (複素数) / (整数) = (複素数)
                (ベクトル) / (整数) = (ベクトル)
                (行列) / (整数) = (行列)
                というように被演算量によって演算の結果は違うわけですし。

                親コメント
              • by Anonymous Coward
                その例でも、実数を複素数と考えれば以下のような結果を期待しませんか?
                • 3.0 / 2 = 1.5
                • (3.0 + 0.0i) / 2 = (1.5 + 0.0i)
                一方、整数は実数に含まれているのに、C や Ruby では
                • 3 / 2 = 1
                のように / は意味として違う値を返します。 返って来る型は問題ではなく、意味として矛盾がないかという問題です。
              • by Anonymous Coward
                その「意味として違う値」ってのがよくわからんけど、 そんなに3/2が1になるのがいやなら、

                require "mathn"

                すれば

                3/2 # => 3/2
                (3/2)*2 # => 3

                っていうふうに有理数は有理数として扱えますよ。 これじゃ駄目?(笑)

                mathn.rbについてはこちら [ruby-lang.org]

              • by (o_o)... (O_o)!! (2806) on 2003年03月20日 21時10分 (#283259)
                そのとおりです。

                1 + 1 はFixnumを返し、
                'hoge' + 'bar' もFixnumを返すべきです!!
                親コメント
    • by Anonymous Coward
      私にとっては同じ方がびっくりなんだけど。
      まあこれは人それぞれですかね。
    • by Anonymous Coward
      Rubyには型があります。

最初のバージョンは常に打ち捨てられる。

処理中...