• ベストアンサー

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

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

  • lah
  • お礼率33% (6/18)
  • Ruby
  • 回答数2
  • ありがとう数29

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

  • ベストアンサー
  • tield
  • ベストアンサー率100% (2/2)
回答No.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# などの言語で無いと腹が立つでしょうけど(笑) 以上でご理解いただけたでしょうか?

lah
質問者

お礼

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

その他の回答 (1)

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.1

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

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

お礼

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

関連するQ&A

  • Ruby 演算子 "==="

    Rubyの演算子 "===" についての質問です。 例:Rubyリファレンスより抜粋 require 'uri' require 'net/http' Net::HTTP.version_1_2 # おまじない def fetch( uri_str, limit = 10 ) # 適切な例外クラスに変えるべき raise ArgumentError, 'http redirect too deep' if limit == 0 response = Net::HTTP.get_response(URI.parse(uri_str)) case response when Net::HTTPSuccess then response when Net::HTTPRedirection then fetch(response['location'], limit - 1) else response.error! end end HTTPRedirectionが起きたと仮定して。 この case文だと思った通りの動きをします。 しかし、case文の部分を if response == Net::HTTPRedirection としたところ if文の中に入ってきません。何故でしょう? if response === Net::HTTPRedirection としても同じ結果でした。 Rubyを勉強しはじめて 初日からこんな調子ですが 宜しくお願いいたします。

  • VBAの演算について

    Rubyで余りの計算をすると (-12977 % 60) + 1 =44 ちなみにVBAでは (-12977 mod 60) +1 =18 になるのはなぜでしょうか。 Rubyの方の演算のが正しいと思うのですが、 VBAはなぜ間違えた演算をしてしまうのか検証できる方はいらっしゃいませんか。

    • ベストアンサー
    • Ruby
  • rubyでは比較演算子もメソッドとして書き換えが可

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

    • ベストアンサー
    • Ruby
  • Rubyってどうよ!?

    Rubyってかなり良さそう(一通り文法を見た限りでは、少なくとも 対象領域 がもろかぶる Perl よりはかなり良さそう)だけど、実際どんなもん? もちろん、現行サポート体制がままなっていないけれど、オライリーからも「動物本」が出ているし、今後PHPと平行して、サポートするところが増えてきそう。 (なんといってもマニュアルが全て日本語から先行して出て行くところが、われわれが他の言語で背負いつづけている一種の「ハンデ」が逆転するわけでおもしろい。) で、Ruby関連の掲示板にとうこうすると、感情的な意見ばかりくるだろうから、ここに投稿したわけなのですが、冷静に見て、将来Rubyはどんなものですかね。 (私の見る限り、「真のオブジェクト指向」「真のスクリプト指向」を実現している唯一の言語だと思うのですけど、文字列系記述はPerlと同等に強力で、オブジェクト指向にいたっては他の言語の追随をゆるさず、スクリプト的柔軟さでも、Perlをも軽く凌駕していると思いました。あくまで文法を一通りみての感想ですが。。。) なお、Ruby関連サイトは大体見て回ったので、サイト紹介はいらんです。

  • Ruby オススメの本

    Rubyを勉強している初心者ですが、オススメの本とかありますでしょうか? 「パーフェクトRuby」を買おうか、一番新しい本である「楽しいRuby」を買うか、Rubyの開発者であるまつもとゆきひろさん著の「プログラミング言語Ruby」を買うのが良いのか、それとも、他にオススメの本がありますでしょうか? RubyからRuby on Railsへと繋げていきたいと思っているのですが、オススメの本がありましたら、教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • Ruby
  • ビット演算子

    掲題の件ですが、 ネットを調べていて他の言語のビット演算子は見つけることができたのですが、Visual Basicでのビット演算子が見つかりませんでした。 ビットシフトだと A >> 2 A << 2 などとかかれていたのですが、これは使えるのでしょうか? よろしくお願いいたします。

  • 余りの演算子%について

    C言語の質問です。 -2%10  の演算に対して 8 を期待していたのですが、 演算結果は、 -2 でした。 -2 を 8 にする演算は、存在しないんでしょうか?

  • rubyを勉強中。おすすめのソースは?

    ruby言語の勉強を始めました。文法については、ざっと本を読みました。 そこで、他の上手な人が作ったrubyソースを解読してノウハウを取り入れたいいと思っています。 rubyで書かれた良いソースプログラムには、どんなものが有るでしょうか? よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby ダウンロードについてです

    本を読んでいてRubyというプログラミング言語に興味を持ちました。早速ダウンロードしようとしたんですが、よくわかりません。わかりやすく、安全にRubyをダウンロードできるサイトを教えてください。

    • ベストアンサー
    • Ruby
  • 初めてのプログラミング、rubyかphpか

    初めてプログラミングを学ぶのですが、rubyかphpかで迷っています。 現在のところの目的は、HP作成で、このokwaveのようなフォームを多用したサイトを作りたいと思っています。となると、PHPが向いているのでしょうが、「PHPはテンプレート言語だからプログラムの知識がつかない(他の言語に手を出すときにつまづく)」と聞きます。 そこで、RUBYも選択肢に入れています。 あと、WEBアプリ開発となると、PERLという言語もあるそうですが、PHPとどこが違うのですか? 回答お願いいたします。

専門家に質問してみよう