どうしてなのか
ruby には、インクリメント(++) と デクリメント(--) が存在しない。
Matz の答え
[ruby-list:5323] Re: Questions on specs and threads
3) 記号的な記法
これは単なる私の趣味ですが, 単項インクリメントとかがたまに欲しく
なります. i += 1 でいいわけですが. i++ と書いて怒られる (^^;
すんません.この件は以前から指摘されているのですが(演算子はCに似ているのに++と--は対応する演算子が無い),++の動作が本質的に「変数を操作する」ものであるため,変数がオブジェクトでないRubyでは導入できないでいます.++や--の「オブジェクト指向的意味」がRubyの他の部分と整合性を保ったまま定義できれば採用したいのですが….
以下、自分なりの解釈
- Ruby は純粋オブジェクト指向であるので、数値といえどもオブジェクトである
- 数値クラス(Fixnum、Bignum)は、Flyweight パターンで実装されているため、同じ数値を持つオブジェクトは全て同じ object_id となり(singleton)、immutable である
- ++, -- はレシーバーに対して操作を行うメソッドとみなされるので、オブジェクトに対して変更を行うものとなる
- 2.のことから、一度変更を加えると全ての参照箇所の数値が変更されてしまう
インクリメントしたい場合、i += 1
や succ
や next
を使う
<参考>
Tavi's Travelog - Rubyにおけるインクリメント
20.Flyweight パターン | TECHSCORE(テックスコア)