![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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# などの言語で無いと腹が立つでしょうけど(笑)
以上でご理解いただけたでしょうか?
No.1
- 回答日時:
ありがとうございます!参考になりました。
ただ、
『++の動作が本質的に「変数を操作する」ものであるため,変数がオブジェクトでないRubyでは導入できないでいます.』
がいまいちしっくり来きてません
なんとなく
bar += 1
ができるからと思って、ためしに
class Fixnum
def ++
self += 1
end
end
とかってできそうな気がするんですが、たしかにやってみるとエラーになっちゃいますね。
ともあれ、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby Ruby / passenger のインストールについて 1 2023/01/30 18:31
- その他(プログラミング・Web制作) HTMLを組み込むことができない言語 3 2022/05/21 10:05
- 哲学 AIと人間の思考の違い 12 2023/02/04 12:21
- Ruby プログラミング講師はまだ需要ありますでしょうか? 1 2022/11/07 19:43
- Ruby Gitのクローンについて 3 2022/04/10 12:28
- 物理学 量子力学 生成消滅演算子 2 2022/08/04 23:17
- 英語 カーペンターズ「Your Wonderful Parade」の歌詞の和訳(意訳OK)&背景について 1 2022/07/10 16:58
- カップル・彼氏・彼女 他校に通う彼氏が演劇部で恋愛の物語をやるそうです。しかも恋人役です。彼の所属する演劇部は女の子の民度 2 2022/08/31 08:08
- PHP 空文字 "" ですが 空文字の意味を教えてください。 3 2022/08/05 03:51
- 物理学 外国人と思われている 3 2022/11/05 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1、Rstudioで回帰直線を求める...
-
(再質問)エクセルのマクロボ...
-
エクセル 連続保存マクロ
-
Beautiful Soupのインストール...
-
ビーリアルのユーザー名を変え...
-
pandasでsqlite3にテーブル作成...
-
Ruby on railsをrails sで立ち...
-
ファイルの切り出しプログラム...
-
GitHubについて
-
Rubyのみでスレがあってそこに...
-
IDLE.Shell 3.10.0
-
プログラミング初学者の勉強方法
-
NCルータープログラム学習方法
-
特定のセルの文字数を数え、奇...
-
C言語の入力した文字を反転させ...
-
未経験者がwebサービスを開発す...
-
void lcd_str(unsigned char* p...
-
情報の表現。()内がどうしても...
-
pythonのerrorコード
-
三項でたとえば交換って
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Rubyの超初心者です。「戻り値r...
-
【BrowseForFolderでデスクトッ...
-
python return 関数
-
【引数と戻り値の違い】 はじめ...
-
CloseとQuitについて
-
再帰に関する質問です。
-
ブロックつきメソッドやyield文...
-
railsチュートリアル5章の演習
-
【Ruby】 文法的に何が悪いの...
-
rubyでのproc
-
ぱいソン
-
Rubyにインクリメンタル演算子...
-
ジェネレーターとはなんですか?
-
railsでアプリケーションコント...
-
ハッシュ(単語数を数える) た...
-
Ruby Fileクラスについて
-
レコードセットオブジェクトの...
-
timesの使いどころ
-
Unixのwcコマンドの簡易版ですが
-
自作したメソッド・・・こんな...
おすすめ情報