• ベストアンサー
  • 暇なときにでも

Rubyにインクリメンタル演算子がない理由は?

Rubyには他の言語でよくある++演算子がないようなのですが、 なぜないのでしょうか? 盛り込むのはそう難しくないと思うので、ないのはそれなりの思想があると思うのですが、どういう意図なのでしょうか?

  • lah
  • お礼率33% (6/18)

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数3472
  • ありがとう数29

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2
  • tield
  • ベストアンサー率100% (2/2)

No.1の方のURLが端的なのですが、もう少し詳しく書いてみます。 Ruby での「数」は「数が格納された箱」ではなく「数」そのものです。 例えば String は「文字列が格納された箱」なので、<< の用な破壊的なメソッドを使い、foo = "0"; foo << "1"; p foo とすれば "01" と表示されます。また、foo = "0"; bar = foo; foo << "1"; p bar としても、bar は foo と同じ文字列が格納された箱を示しているので "01" が表示されます。この辺りは Array や Hash などの「何かを格納する箱のようなもの」でも同じですね。 さて、Ruby では Fixnum などが数字そのもののためこの様な破壊的な動作が出来ません。もし出来てしまうと、foo = 0; foo++ としたときに、そのスクリプト中にある全ての 0 が 1 になってしまいます。これは Symbol・true・false・nil なども同じです。 もう少し簡単に言えば、Ruby では数字や Symbole などはリテラルで表現した物はどこでも同じインスタンスが返る(irb で 0.__id__ や :foo.__id__ を何度実行しても同じ値が返ってきて、"foo".__id__ は実行する度に違う値が返ってくる事などで確認できます)ため、++ の様なメソッドが存在してしまうと、foo = 0; bar = 0; foo++; p [foo, bar] と書いたとき、foo と bar は先の String の例と同様、同じオブジェクトを指しているので、[1, 1] と表示されることになる、ということです。 専門的(?)に言えば、これらは Flayweight パターンを利用した immutable なオブジェクトなので破壊的変更が出来ません。 なお foo += 1 は、Ruby の内部で foo = foo + 1 と展開されて解釈されているので問題ありません。 シンタックスシュガーとして Numeric#++ というメソッドを作りませんか? という話は、何度か No.1 の方の URL 以外でも出ていたと思うのですが、Matz 氏は Ruby のそのような世界観から考えると、破壊的に見えるメソッドが Numeric などに実装されるのは、それがシンタックスシュガーといえどやはり整合性に欠け好ましくない、ということで退けていたと思います。 個人的には、Ruby は内部イテレータ関係が豊富で for 文を使うことはまずありませんし、1.9系や 1.8.7 などのバージョンではさらに Enumerator が実装され (10..35).each.with_index{|i, idx| ...} などと書けるようになり、foo += 1 と書く機会がほとんど無いので気になりませんね。C++ や C# などの言語で無いと腹が立つでしょうけど(笑) 以上でご理解いただけたでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

詳しい解説ありがとうございます! スッキリしました。

その他の回答 (1)

  • 回答No.1

↓ここに書かれていますね

参考URL:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/5323

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます!参考になりました。 ただ、 『++の動作が本質的に「変数を操作する」ものであるため,変数がオブジェクトでないRubyでは導入できないでいます.』 がいまいちしっくり来きてません なんとなく bar += 1 ができるからと思って、ためしに class Fixnum def ++ self += 1 end end とかってできそうな気がするんですが、たしかにやってみるとエラーになっちゃいますね。 ともあれ、ありがとうございました。

関連するQ&A

  • rubyでは比較演算子もメソッドとして書き換えが可

    rubyでは<や>などの比較演算子もメソッドと分類されるのでオーバーライドが可能と認識しております。具体的にどのようにコーディングしたら良いのでしょうか? 例えば、配列に数値が格納されているとします。 array=[3,5,4,2,1] この配列をソートした場合に比較が何回行われたかをカウントしたいです。 p array.sort >や<が再定義可能なら、比較演算子が呼ばれる度にカウンターアップするなどと言う事はできるような気がするのですが、どうコーディングしてよいか解りません。 rubyのマニュアルも読んだし、それなりに検索でも頑張ったのですが、煮詰まってしまいました。 ご指導のほど、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 演算子 Ruby認定試験対策問題

    Ruby認定試験対策問題をやっていたら分からないところがあったので、 教えてください。 2.4.演算子 ■問題 次の各行を独立して実行した場合、エラーとなる行があった。エラーとなった行について正しく述べているのはどれか。 A: 1 << 1 B: 1 << 1.0 C: 1.0 << 1 D: 1.0 << 1.0 ■回答 正解は(1)「C行, D行がエラーとなった。」 ■解説 Float には、<< 演算子が定義されていません。また、Integer型に、<< 演算子の引数として、浮動小数点を渡しても、引数は自動的にInteger型に変換され、正しく処理されます。 とあるのですが、問題の意味、なぜ回答が(1)になるか、また、解説の「Integer型に、<< 演算子の引数として、浮動小数点を渡しても」がどの部分を指すのかが分かりません。 自分が調べた限りでは、 << はIntegerクラスのメソッド(シフト演算子)で、ビットを左にシフトするものということだけなのですが……。 この場合、問題の主旨は、例えば「Aだと、1 を 1 ビット左にシフトする」、「Bだと、1 を 1.0 ビット左にシフトする」、「Cだと、1.0 を 1 ビット左にシフトする」という意味なのでしょうか。 また、演算子の引数というのは、<<より右側を指すのでしょうか?

    • ベストアンサー
    • Ruby
  • python [ ] 演算子?

    pyhonで、文字列・リストのindex(要素)にアクセスするのに[ ]を使うが、これは演算子と考えて良いのか疑問に思った。 pythonは”数学的正確さ”を目指した言語である以上、演算・関数・メソッドのいずれかに含められるはずで、関数・メソッドでない以上演算子であると考えるのが普通だと思うが、いかがでしょうか? indexにアクセスするものとの説明があるが、[ ]がどこに分類されるかの説明が見受けられない。 いかがなものでしょうか?

  • 演算子

    演算子 PHPでなくても、演算子は出てくると思いますが、 $a <> $b $a != $b 両方とも 「$a $bが等しくないときにtrue」ととあるwebページに書いてありますが、 <>と!=はどう違うのでしょうか。

    • ベストアンサー
    • PHP
  • 演算子について

    量子化学での運動量演算子とハミルトニアン演算子の違いはあるんでしょうか?違いがあるならシュレーディンガー方程式に作用させた時にどのような違いが出てくるか教えてください

  • 微分演算子について質問です。微分演算子はδ/δxやδ/δyなどと表され

    微分演算子について質問です。微分演算子はδ/δxやδ/δyなどと表されますが、微分演算子同士をかけたりしたとき、交換したり、分配したりすることができますよね。また、δ/δx(▽×A)=▽×(δ/δx)Aのようにできたりします。これは微分演算子は多元環の元ということでしょうか?また、δ/δx(▽×A)=▽×(δ/δx)A(外積の計算)というようにかけるのは、微分演算子を、外積の計算におけるスカラー乗法のように考えてもいいということなのでしょうか?わかる方がいらっしゃいましたら教えてください。

  • 演算子について

    基本的な質問だったら申し訳ないのですが、自分ではちょっと解決できないのでお答えいただけたらありがたいです。 シュレディンガー方程式の波動関数ψ(x)の問題でエネルギーの期待値を求めるときには演算子としてih'd/dxを使うというのは教科書にかいてありわかったのですが、x自体の期待値を求めよという問題では何か別の演算子をつかうのでしょうか? 的を得た質問でなっかたらすいません。

  • スコープ演算子について

    php素人です スコープ演算子についておしえてください 質問1 スコープ演算子を使えばclass内の変数を下記のような書き方で取得できますか? 質問2 スコープ演算子を使うとアロー演算子でオブジェクトを作成するよりプログラムの負荷の軽減になるのですか? 質問3 アロー演算子を使わずにスコープ演算子を使ったほうがいいのでしょうか? 質問4 スコープ演算子のデメリットはありますか? class Message { public $number=1; function hello() { return "こんにちは"; } } $number = Message::$number; $message1 = Message::hello(); よろしくお願いします

    • ベストアンサー
    • PHP
  • 演算子?

    VBAを学習していますが、 andやorなどのカテゴリーは演算子という名称であってますか?

  • 置換演算子

    量子力学を勉強していたら、置換演算子という言葉が出てきました。この置換演算子って何ですか?どなたか教えてください。