或るプログラマの開発日記

日々の勉強したことの備忘録なんかに使っていきます

Rubyにはインクリメント演算子(++)が無い

Rubyを書いてて、いつも疑問に思ってた事項なので自分用にメモ。

CやJava、またはPerl等のプログラム言語では、整数の値に1を加算する時にインクリメント演算子++を使用します。しかし、Rubyではインクリメント演算子を使うことは出来ません。

インクリメント演算子が無い理由

Rubyの開発者であるMatzさんが、過去この件について言及されておりました。

3) 記号的な記法

これは単なる私の趣味ですが, 単項インクリメントとかがたまに欲しく
なります. i += 1 でいいわけですが. i++ と書いて怒られる (^^;


すんません.この件は以前から指摘されているのですが(演算子はC
に似ているのに++と--は対応する演算子が無い),++の動作が本質
的に「変数を操作する」ものであるため,変数がオブジェクトでな
Rubyでは導入できないでいます.++や--の「オブジェクト指向
意味」がRubyの他の部分と整合性を保ったまま定義できれば採用し
たいのですが….

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

以下、自分なりの解釈。

Rubyでは整数値はオブジェクトであるためインクリメント演算子を実現しようとすれば変数が参照しているオブジェクトそのものに作用する必要がありますが、++演算子が変数に対して作用するものであるため実現が困難であるということですかねぇ。

また、RubyのFixnumクラスはimmutableですので、さらに実現は困難ですね。

Ruby の Fixnum クラスは immutable です。 つまり、オブジェクト自体を破壊的に変更することはできません。 Bignum も同様です。

https://docs.ruby-lang.org/ja/latest/class/Fixnum.html

インクリメントメソッド

尚、Fixnumクラスにはnextsuccという値に+1するメソッドはあります。しかし、前述の通りFixnum自体がimmutableである為、

num=10
num.next

としてもnumの値は変化しません。

結論

Rubyでは、整数をインクリメントする場合はおとなしく+=1を使いましょう。