ベストアンサー Rubyにインクリメンタル演算子がない理由は? 2009/01/16 11:27 Rubyには他の言語でよくある++演算子がないようなのですが、 なぜないのでしょうか? 盛り込むのはそう難しくないと思うので、ないのはそれなりの思想があると思うのですが、どういう意図なのでしょうか? みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー tield ベストアンサー率100% (2/2) 2009/02/16 03:47 回答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# などの言語で無いと腹が立つでしょうけど(笑) 以上でご理解いただけたでしょうか? 質問者 お礼 2009/02/16 15:41 詳しい解説ありがとうございます! スッキリしました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (1) singlecat ベストアンサー率33% (139/418) 2009/01/16 11:50 回答No.1 ↓ここに書かれていますね 参考URL: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/5323 質問者 お礼 2009/01/16 12:20 ありがとうございます!参考になりました。 ただ、 『++の動作が本質的に「変数を操作する」ものであるため,変数がオブジェクトでないRubyでは導入できないでいます.』 がいまいちしっくり来きてません なんとなく bar += 1 ができるからと思って、ためしに class Fixnum def ++ self += 1 end end とかってできそうな気がするんですが、たしかにやってみるとエラーになっちゃいますね。 ともあれ、ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Ruby 関連する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では<や>などの比較演算子もメソッドと分類されるのでオーバーライドが可能と認識しております。具体的にどのようにコーディングしたら良いのでしょうか? 例えば、配列に数値が格納されているとします。 array=[3,5,4,2,1] この配列をソートした場合に比較が何回行われたかをカウントしたいです。 p array.sort >や<が再定義可能なら、比較演算子が呼ばれる度にカウンターアップするなどと言う事はできるような気がするのですが、どうコーディングしてよいか解りません。 rubyのマニュアルも読んだし、それなりに検索でも頑張ったのですが、煮詰まってしまいました。 ご指導のほど、よろしくお願いいたします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム Rubyってどうよ!? Rubyってかなり良さそう(一通り文法を見た限りでは、少なくとも 対象領域 がもろかぶる Perl よりはかなり良さそう)だけど、実際どんなもん? もちろん、現行サポート体制がままなっていないけれど、オライリーからも「動物本」が出ているし、今後PHPと平行して、サポートするところが増えてきそう。 (なんといってもマニュアルが全て日本語から先行して出て行くところが、われわれが他の言語で背負いつづけている一種の「ハンデ」が逆転するわけでおもしろい。) で、Ruby関連の掲示板にとうこうすると、感情的な意見ばかりくるだろうから、ここに投稿したわけなのですが、冷静に見て、将来Rubyはどんなものですかね。 (私の見る限り、「真のオブジェクト指向」「真のスクリプト指向」を実現している唯一の言語だと思うのですけど、文字列系記述はPerlと同等に強力で、オブジェクト指向にいたっては他の言語の追随をゆるさず、スクリプト的柔軟さでも、Perlをも軽く凌駕していると思いました。あくまで文法を一通りみての感想ですが。。。) なお、Ruby関連サイトは大体見て回ったので、サイト紹介はいらんです。 Ruby オススメの本 Rubyを勉強している初心者ですが、オススメの本とかありますでしょうか? 「パーフェクトRuby」を買おうか、一番新しい本である「楽しいRuby」を買うか、Rubyの開発者であるまつもとゆきひろさん著の「プログラミング言語Ruby」を買うのが良いのか、それとも、他にオススメの本がありますでしょうか? RubyからRuby on Railsへと繋げていきたいと思っているのですが、オススメの本がありましたら、教えて下さい。 よろしくお願い致します。 ビット演算子 掲題の件ですが、 ネットを調べていて他の言語のビット演算子は見つけることができたのですが、Visual Basicでのビット演算子が見つかりませんでした。 ビットシフトだと A >> 2 A << 2 などとかかれていたのですが、これは使えるのでしょうか? よろしくお願いいたします。 余りの演算子%について C言語の質問です。 -2%10 の演算に対して 8 を期待していたのですが、 演算結果は、 -2 でした。 -2 を 8 にする演算は、存在しないんでしょうか? rubyを勉強中。おすすめのソースは? ruby言語の勉強を始めました。文法については、ざっと本を読みました。 そこで、他の上手な人が作ったrubyソースを解読してノウハウを取り入れたいいと思っています。 rubyで書かれた良いソースプログラムには、どんなものが有るでしょうか? よろしくお願いします。 Ruby ダウンロードについてです 本を読んでいてRubyというプログラミング言語に興味を持ちました。早速ダウンロードしようとしたんですが、よくわかりません。わかりやすく、安全にRubyをダウンロードできるサイトを教えてください。 初めてのプログラミング、rubyかphpか 初めてプログラミングを学ぶのですが、rubyかphpかで迷っています。 現在のところの目的は、HP作成で、このokwaveのようなフォームを多用したサイトを作りたいと思っています。となると、PHPが向いているのでしょうが、「PHPはテンプレート言語だからプログラムの知識がつかない(他の言語に手を出すときにつまづく)」と聞きます。 そこで、RUBYも選択肢に入れています。 あと、WEBアプリ開発となると、PERLという言語もあるそうですが、PHPとどこが違うのですか? 回答お願いいたします。 ScilabのRUBYインターフェース Scilabを外部言語、とりわけRUBYから制御したいと思っています。 ScilabのAPIはあるようですが、検索してもRUBYの情報は得られませんでした。 (R言語などはRUBYでもOKのようですね。) もし何らかの手法をご存知の方がおられましたらご教授お願いします。 Ruby sortメソッド RubyのEnemuratableモジュール内で定義されているメソッドのひとつsort メソッドの使い方が良くわかりません。 ブロックや<=>演算子を用いて何か分かりやすい例はありますでしょうか? AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム rubyの記号の意味を調べる方法 rubyには他の言語にはない多様な記号が出てきますが、googleでこれらのキーワードをなかなか調べられません。 良い方法はありますでしょうか? 「<=>」、「%W」、「...」、「<<」などです。(この他にもたくさんあります) 演算子 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 プログラミングずぶの初心者で、rubyを勉強しようと思っているのですが みなさんは、どの参考書でどのように勉強されたんでしょうか?そこのとこ ろごが知りたいです。よろしくお願いします。あと、他の言語がどれくらい できますか? 繰り返しの演算 C言語についてです 数値データのファイルからデータを読み取り四則演算をするプログラムをつくっているのですが、2つでペアの数値データが4つあります。これを繰り返し演算できるようにする関数はありますか? 演算子(+=)について 演算子(+=)について C言語のプログラム中に(1)の文が存在するのですが、(2)の文と同じ意味でよろしいでしょうか? a+=8; ・・・(1) a=a+8; ・・・(2) 教授下さい。 よろしくお願い致します。 Rubyの得意分野は? これまでJavaしか触ってこなかったのですが、この度Rubyに触れる機会を頂きました。 Rubyについては全く知識がないのですが、Javaに慣れている私のような者にとって学びやすい言語でしょうか? また、例えば(考え違いがあるかも知れませんが)「PHPと言えばコンシューマ向けのWebアプリケーション」、「Javaと言えばエンタープライズ向けのWebアプリケーション」といったように、「Rubyと言えば…」というような、Rubyがよく用いられていたり、得意とする分野はどういったものでしょうか? どうぞよろしくお願いします。 プログラミング言語 rubyを用いて、 プログラミング言語 rubyを用いて、 画像処理プログラミングを書こうとしていますが、以下の点が分かりません。 1・メモリの動的確保はどうするの?(C言語でいうmalloc) 2・ファイルから配列に展開するにはどうしたらいいの? 以上が分かればわかるきがするのですが・・ 当方 C言語での画像処理プログラミングはそれなりに経験があるのですが rubyで実現できるのかわからなくて・・ PHPとかperlとかrubyとか 質問させていただきます。 プログラミング言語を学ぼうと思っています。 ありがちな質問ですが、言語の特徴などを伺いたいと思います。 PHPはWEBに特化した言語だと聞きました。 あとperlはテキスト処理だけでどうも、、、って話も。 rubyはまだプログラムの話で出てこないことも多い。 やりたいことがあっての言語なのは承知しています。 WEBやデータベース、スタンドアロン?の簡単なソフト開発とか、いろいろやりたいことは多いです。 最初に目をつけた敷居が低いとされるWEBに特化したPHPはソフト開発には向かないらしいし、偏ったものもどうかと思ってます。 でも次の言語にJAVAを考えていて(JAVAは習得が難しいと聞きましたので)、PHPはJAVAに多少似ているってどっかのサイトで見ました。たぶん賛否両論はあるでしょうが。 別にWEBプログラムだからってperlでもrubyでもできるんですよね?だったら偏ったPHPよりperl、rubyの方が書いていて楽しいような気がします。rubyの需要はまだ少なそうですし、perlのテキスト処理だけってのもどうなんだろうと思いますが。そこらへんも聞きたいです。 簡単なゲームとか、顧客管理ソフトとか、WEBとかデータベースとか、できれば敷居が低く楽しめる言語があればと思ってます。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
詳しい解説ありがとうございます! スッキリしました。