「Ruby」参考情報 第8回 Rubyにインクリメント演算子が無い理由として、「(1)インクリメント演算子とは」「(2)Rubyにインクリメント演算子が無い理由」「Rubyでインクリメント演算子が使えない理由まとめ」について紹介。

「Ruby」参考情報 第8回 Rubyにインクリメント演算子が無い理由

「Ruby」参考情報 第8回 Rubyにインクリメント演算子が無い理由として、「(1)インクリメント演算子とは」「(2)Rubyにインクリメント演算子が無い理由」「Rubyでインクリメント演算子が使えない理由まとめ」について紹介。

■関連する比較ページ

(1)インクリメント演算子とは

■インクリメント演算子

数値型変数の値を1だけ増加させる演算子です。

「++」記号を使用します。

「num++」は、「num = num+1」「num += 1」と同じになります。

■デクリメント演算子

数値型変数の値を1だけ減少させる演算子です。

「--」記号を使用します。

「num--」は、「num = num-1」「num -= 1」と同じになります。

■(Java)サンプルコード

int num = 3;
System.out.println(num); //出力1
num++; //プラス1
System.out.println(num); //出力2
num++; //プラス1
System.out.println(num); //出力3
num--; //マイナス1
System.out.println(num); //出力4

■(Java)サンプルコード 結果

3 //出力1
4 //出力2
5 //出力3
4 //出力4

(2)Rubyにインクリメント演算子が無い理由

多くのプログラミング言語(Java、Perl、PHP、C系言語など)では、インクリメント演算子を使うことができます。

しかし、Rubyでは、インクリメント演算子は使えません。ちなみに、Pythonも使えません。

「Rubyにインクリメント演算子が無い理由」について、「Ruby開発者(まつもとさん)のお答え」と「Rubyユーザの皆さんの見解」を引用して紹介します。

■Ruby開発者(まつもとゆきひろさん、Matzさん)のお答え

質問

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

回答

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

→Re: Questions on specs and threads

■Rubyユーザの見解(1)

Rubyではその他の多くのプログラミング言語と違い、「変数」を「オブジェクト」として扱っていないようです。そのためRubyにおいての変数は、数そのものへのポインタということになり、ここに破壊的動作である++演算子を使用してしまうと、「ポインタの位置がインクリメントされる」という正しく破壊的な結果がもたらされてしまうようです。

その結果どういうことになるかというと、変数の値だけでなく、プログラム内で扱っている1という数字へのポインタが2を向くようになってしまいます。つまり、そのプログラム内では「1も2も2」に変更されてしまうのです。

そのため、Ruby開発者のまつもと氏は「本当は使えるようにしたいけど、Rubyの設計上禁止せざるを得ない」というようなことを言っています。

→アベログ →Rubyでは++演算子によるインクリメントができない

■Rubyユーザの見解(2)

n++ はオブジェクト n に対するメソッドのように見えます。 しかし、メソッドは変数 n ではなく、n が参照しているオブジェクトに対する操作です。 それに従った、数値(例: 2)オブジェクトの意味を変える(例: 2 オブジェクトを 3 の意味にする)という処理をするわけではありません。 インクリメントは、変数が参照する数値オブジェクトを、別の数値オブジェクトに切り替える処理になります。

つまり、見た目から推測される動作が異なる(メソッドに見えるがそうではない)というわけです。 メソッドに見えてしまう理由は、おそらく = が表記されていないからでしょう。 このような考えはオブジェクト指向に特殊な考えと考えることもできるでしょうが、そこから外れるということは統一性を欠いて複雑になるということです。 オブジェクト指向の考えなしに現在の高機能なプログラミング言語はできません。

→Snap Note 開発記 from ソフトウェアデザイン館 Sage Plaisir 21 →インクリメントの演算子を書くな - リーダブル・コード(35)

■Rubyユーザの見解(3)

・Rubyのメソッドの引数は値渡し
・Rubyの変数は全てオブジェクトを指し示すポインタに似た何か
・Rubyの変数はラベル

Cにおける変数は箱だと例えられるが、Rubyにおける変数はラベルと例えられることがある。Cの変数では、メモリ上の箱に値がそのまま入っている。代入をすれば、箱が複製される。

一方、Rubyではメモリ上の箱のどこかに値が入っており、変数はラベル(箱への参照)を持っているだけにすぎない。 変数を代入すると、メモリ上のデータはそのままに、ラベルだけがコピーされるのである。

Rubyにインクリメント演算子がない理由は簡単で、RubyのFixnumクラスやBignumクラスは immutableだからだ。つまり、オブジェクト自体を破壊的に変更することはできない。

もし、オブジェクト自体を破壊的に変更できたらどうなるだろうか。大変なことになってしまう。

→gam0022.net →初心者が混乱しやすいRubyの変数

Rubyでインクリメント演算子が使えない理由まとめ

以上の内容を、ごくごく簡単にまとめてみると、次のようにまとめることができるでしょうか。

・Rubyの変数は、オブジェクトに対するポインタ(ラベル)のようなもの

・ポインタに対してのインクリメント処理を可能にしてしまうと、ポインタの位置がインクリメントされてしまう

Ruby最新TOPICS

【講演資料を公開】3/22「スマホアプリの開発プロセスについて~実は重要なサーバーサイドの開発と、Laravel(PHP) と Rails(Ruby)~」(2018年04月27日 10:04)

2018年03月22日(木)17:00~18:30 AP品川 9階 にて「スマホアプリの開発プロセスについて~実は重要なサーバーサイドの開発と、Laravel(PHP) と Rails(Ruby)~」と題したセミナーを開催しました。 当日は、会場の様子をWebで中継し 遠隔地等ご来場出来ない方にもご参加頂きました。お陰様で、盛況のうちに終了することができました。ありがとうございました。 講...

イベント情報

  • Zabbixカンファレンス2019
  • OSSNEWSに広告を掲載しませんか?

facebook

twitter