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

Rubyの世界的人気度、TIOBE 9位に上昇」記事へのコメント

  • 割り算 (スコア:1, 興味深い)

    by Anonymous Coward on 2007年11月26日 15時49分 (#1255765)
    ちょっとしたテキスト処理とか、ちょっとしたネットワーク処理とかにRubyは便利なんだけど、
    ちょっとした計算をするプログラムが書き難い気がする。

    特に、割り算(/)の定義がCに合わせてあって、整数と実数とで扱いが違うのが不自然。
    たとえば、この三角形の面積を計算する関数が間違いだというのは、どうも納得がいかない。
    def triangle(base, height)
        base * height / 2
    end
    もちろん、to_f とか quo を使ったり、引数に整数が来ないように気を付けたりすればいいんだけど、
    そういうことに気を使わなければならない必然性が良くわからない。

    元のCの場合にはこの問題は起きないわけだから、単純にCに合わせるというのは合理的でないし、
    実際PerlやPythonではCに合わせなかった。そこを敢えてこのようなふるまいにしたのは何故なのでしょうか?
    • Re:割り算 (スコア:3, 参考になる)

      by oldwave (20436) on 2007年11月26日 17時02分 (#1255790) ホームページ 日記

      何故かって言われても、二項演算子の正体がメソッド呼び出しのシンタックスシュガーだから、としか言いようがない気が。

      というか戻り値を浮動小数にしたいなら、base * height / 2.0って書けば良いだけで、すぐに慣れると思うけど。

      親コメント
      • Re:割り算 (スコア:1, すばらしい洞察)

        by Anonymous Coward on 2007年11月26日 18時59分 (#1255829)
        > 何故かって言われても、二項演算子の正体がメソッド呼び出しのシンタックスシュガーだから、としか言いようがない気が。

        いや、メソッドだろうがオペレータだろうが関係なく、オーバロードしてある(デフォルトの)動作に一貫性が無いってことなんじゃない? 何を以って一貫してるとするかは議論の余地があるけど、これに関してはCの悪い面を引きずったと言えるんじゃなかろうか。(「Cの仕様と一貫性がある」とは言えるだろうけど。ほんとに便利?)

        尤も、万人が納得する解決は無いだろうけどね。正確に割り切れない時は浮動小数点数に型変換する、という仕様だと、思わぬところで制度が落ちることがある。両方が正確な数なら分数で計算する、という仕様だと、うっかりしてると計算のほとんどが分数のまま進行して(浮動小数点数演算に比べて)がくんと性能が落ちることがある。
        親コメント
      • by Anonymous Coward
        > 何故かって言われても、二項演算子の正体がメソッド呼び出しのシンタックスシュガーだから、としか言いようがない気が。

        もちろんそうですが、なぜデフォルトの定義がそうなっているのかという質問です。

        > というか戻り値を浮動小数にしたいなら、base * height / 2.0って書けば良いだけで、すぐに慣れると思うけど。

        なるほど、例が良くありませんでした。
        長方形の面積(area)と幅(width)から高さを求めるときに、area / width と書くのが間違いという話でもいいです。
        たぶん私が言いたいことは、その場に 2 とか 2.0 とか書いてあれば挙動はわかるけど、
        変数にして
        • たぶん私が言いたいことは、その場に 2 とか 2.0 とか書いてあれば挙動はわかるけど、
          変数にしてしまうと挙動がわからなくなってしまうということなんだと思います。
          Rubyの場合だとそのオブジェクトがどこから来たのか追いかけないと挙動が分からない。
          型によって / の意味が「除算」になったり「整除」になったりするようなことでは困るわけです。

          なるほど。そういうフィーリングを持っている人はいるでしょうね。自分はそういうフィーリングではないんだけど、それはそれでわかります。

          僕としては、面積を求めるような処理の場合は各数値を浮動小数で持つことが前提になると思うんですね。浮動小数と整数はかなり挙動が違うので、暗黙の型変換はできるだけない方が良い、と考えるのはそんなに不合理ではないと思います。Matzの考えはここ [nikkeibp.co.jp]あたりによく出ているかな。

          Rubyの場合、BigDecimalやRationalも用意されているので、割り切れない割り算の結果が自動的にFloatに決まるのはちょっと問題ではないかという気がします。

          親コメント
          • by Anonymous Coward
            Rubyがって言うより、演算子オーバーロードがある言語には共通の問題だよね。「そのオブジェクトがどこから来たのか追いかけないと挙動が分からない」ってのは。
            主な原因はソースコード内の演算子そのものは1文字しかなくて圧倒的に情報量が足りないせいだから、メソッド名と同じくらい自由に名前を付けられるようにすれば解決すると思うんだけど、そういう言語ってめったにない。
            最低でもOcamlみたく、浮動小数演算子は「+.」とかにすればいいのに。
            • by Anonymous Coward
              > 主な原因はソースコード内の演算子そのものは1文字しかなくて圧倒的に情報量が足りないせい

              それは違います。どの演算子にどのような演算を割り当てるかを明確にしてさえいれば、
              その定義がどれほど奇抜なものでも、言語を学ぶ段階でわかります。

              Rubyの問題は「/」という演算子にどのような演算を割り当てるかを明確にしていない点にあると思います。
              おそらく「/」は「割り算」だと考えているのだと思いますが、「割り算」という言葉には「通常の除算」と
              「整数を商とする除算」の二つの任意性があるのに、どちらを選択するか明確にしていないということです。
              どちらを選択するかはどうでもいいことですが、どちらかを選択していないことが奇妙な型変換を要求することになるわけです。

              ただ、結論として、浮動小数点「的」な演算子を「+.」のようにするというのは一つの正しい解決策だと思います。
        • by Anonymous Coward
          暗黙の変換に期待せず area.to_f / width.to_f とか明示的にその場で必要なものを書くようにすれば
          変数が整数だろうが知らないオブジェクトだろうが平気という方向で考えてみてはどうでしょう。
    • Re:割り算 (スコア:2, 参考になる)

      by T.Sawamoto (4142) on 2007年11月26日 17時12分 (#1255793)
      いや、Pythonもいわゆる『真の除算(true division)』が導入されるのはPython 3.0からの予定ですよね。
      現時点の最新版であるPython 2.5では、除算"/"を使うと

      $ python -c "print 3/2"
      1

      となります。オプション等で変更すれば

      $ python -Qnew -c "print 3/2"
      1.5

      となりますけど。

      # ちなみに、切り捨て除算は"//"ですね。
      # 個人的には修正し忘れがちょっと怖い(^^;)
      親コメント
      • by Anonymous Coward
        ここ [python.org]に詳しい解説があります。互換性よりも問題解決を優先した大英断ですね。
    • by Anonymous Coward
      三角形の面積を求めたいなら、まず三辺の距離を求めよう。
      (それ不倫の公式)
    • by Anonymous Coward
      * とか / を再定義してマイRubyにしちゃえば?
    • by Anonymous Coward
      require 'mathn'
      すればいかがでしょう?
      数学の数式を書いているつもりでRubyの式が書けますよ。

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

処理中...