トップ «前の日記(2007-07-20) 最新 次の日記(2007-07-22)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2007-07-21

_ ++が無いということ

Rubyには++や--が無いおかげで、即値を即値として特別扱いしなくて済むというメリットがあるのかな?

たとえば、C#とかJavaのように値型とオブジェクト型の2種類が存在すると

int a = 3;
int b = a;
a++;  // a => 4, b => 3  
という値型の振る舞いに対して、オブジェクト型だと
StringBuffer a = new StringBuffer("ab");
StringBuffer b = a;
a.append('c');  // a => "abc", b => "abc"

と、振る舞いが異なる。

ところが、Rubyには++や--のような、即値自体の!メソッドが無いのでせいぜい

a = 3
b = a
a += 1  # =使ってるってことは再代入なので、bと異なってもOK
でしかない。もし、ここで++を!メソッドとして実装してあるとすると、
a = 3
b = a
a++    # a => 4, b=> 4 じゃないとすべてがオブジェクトではない

となるけど、それだと即値として実装できなくなるし(パフォーマンス上、不利)、しかも、++という演算子を利用したい人からすれば、期待する振る舞いとも異なる。つまり、誰も嬉しくない結果となる。

追記:コメント欄とか、a++(ょゎさんのところ)とかも参照

_ ベンチャー

そうか。ビジネスモデルのベンチャーの誕生(テクノロジーでもなければ(というと違うし、それは文字通りにインフラなんだろうけど)、輸入型のビジネスモデルでもない)だったのか。

なんにしろ、すごいことだな。

本日のツッコミ(全10件) [ツッコミを入れる]
_ 桑島 (2007-07-21 11:44)

Numericがmutableな環境において「期待している振舞」が「変数が別ならポインタの指す先が違うこと」であるなら、その期待自体が勘違いでは。<br>でもPHPは++あり即値あり参照ありの動的型言語なので、近い雰囲気ですね。しかし、さっぱり理解できません。<br>http://www.php.net/manual/ja/language.oop5.basic.php#id2693088<br>http://www.php.net/manual/ja/language.references.php

_ arton (2007-07-21 12:31)

++を利用したいって人は、プログラミング言語がCとかJavaとかC#みたいに動くことを期待していると思います。<br>だからRubyにそれを求めるのって、確かに勘違いだよね、ということを書いたつもり(Rubyって1.classとかするとFixnumってクラス名返すわけで、そこで、つまりBignumと違うんだから値型(変数に内容が入っている)と考えるとかしやすいのかなぁ? と)。<br>もちろん、1++ というバンメソッドがありえない以上(でも、++というメソッドが、自分の値に1を加えたオブジェクトを生成して返すという意味にすると、やはり++というメソッドを期待する人にとっては役に立たない。a = 1; a++; で、aは1のままになるから)とか、++が欲しい、--が欲しいと言う人は、そこをわかっているのか(という人を脳内想定しただけで、最近、そのての話題を見たわけじゃないです)、それとも僕が何か見落としてるのか、ってような話。

_ arton (2007-07-21 12:34)

PHPも値とオブジェクトを区別してるのかな。$n++ かぁ。<br>それって直観に反するんだと思うけど、JavaもC#もそれでOKでみんな使ってるってことは、一貫性が無い世界でも、別に良しってことかな。(世の中に一貫性なんてないじゃん、とダブルスタンダードがスタンダードと知る)

_ 桑島 (2007-07-21 15:26)

なるほど、確かに今のRubyで++は論理的にありえないですね。<br>PHPはピュアオブジェクト指向とは程遠い仕様ですし、演算子の再定義とか演算子メソッドの定義ができないので、比較対象として不適切だったと思います。すみません。<br><br>でも一貫性のなさが複雑さに繋がるのは確かだと思います。だってほら、一貫しているRubyのほうが生産性が高いわけだし(とか言ってみる)。

_ Yugui (2007-07-22 00:05)

私もC++からの以降組なので最初は++が欲しかったものです。<br><br>どうしてもというなら、特殊な複号代入演算子と考えて<br> a++ := a = a + a.class.additional_unit<br>とかいう話になるんでしょうけれども。(↑遅そう)<br><br>そこまでしなくても数え上げの手段には不自由しないし(Dave Thomasが言ってたように!)、eachがあればC++でいうイテレータも必要ないので結局Ruby Wayに慣れさえすれば必要性を感じなくなる、のでした。

_ Yugui (2007-07-22 00:06)

あ、<br> a++ := a = a.succ<br>でいいのか。

_ arton (2007-07-22 01:53)

まあ、そうなんだけど > a++ := a = a.succ<br>それって、Rubyの変数に格納されているのは、すべて参照っていうルール(ここを私は誤解しているかも)を破ってると思うんですが。つまり、aという変数の振る舞いになってますよね。aが参照しているNumericオブジェクトじゃなくて。

_ soutaro (2007-07-22 06:23)

>aという変数の振る舞いになってます<br><br>a++ を a = a.succ と看做す、というのは、「a++を一つの構文(syntax sugar)にしてしまって、その意味は a = a.succ と同じ」という話になると思います。これは、特に「変数の振る舞い」とかいう話とは関係なくて、「すべて参照ルール」に矛盾しないと思います。同様の構文として「a += 1」みたいのがあるかと。

_ arton (2007-07-22 11:28)

ああ、なるほど。a += 1と同じと考えるのか。言われてみれば納得です。

_ naruse (2007-07-22 13:48)

"a".succ! はあっても、 1.succ! はないのですよねぇ。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|

ジェズイットを見習え