[ruby-list:119] Re: i++

From: matz@... (Yukihiro Matsumoto)
Date: 1996-02-02 07:06:34 UTC
List: ruby-list #119
まつもと ゆきひろ@トヨタケーラムです.

In message "[ruby-list:118] i++"
    on 96/02/02, P nakawtse <nakawtse@syrinx.dq.isl.ntt.jp> writes:

|中渡@NTTです.

| #++がなかったとは...
| #もっと演算子を.

実は++演算子はオブジェクト指向と馴染まないんですよ.というのも
rubyの場合,演算子もメソッドコールになっているんです(シンタッ
クスシュガーをかぶせているですけど).i++などの場合,レシーバ
が「変数」でないとうまくいかないんですね.

 i=10
 i++

で10に「1増えろ」というメッセージを送っても意味無いんですよ
ね.変数はrubyの場合オブジェクトじゃないですし.まあ,i++は
i+=1のシンタックスシュガーである,としても良いんですけど,多
分ちっとも速くないですよね.i+=1と1文字しか違わないし,高速
でもないので今のところ採用していないんですよね.

| イテレータの方も毎回定義を参照してるのではないの?

あ,これはCで定義しているイテレータの場合です.rubyで定義し
たイテレータはどうなるのかなあ.

   time ruby -le 'def until(cond); return if cond; yield;retry end; i=0; until(i==10000){i+=1}'

としてみた限りではそれほど違わないみたいですねえ.

|−−−−−
||適切なメソッドが無くてイテレータ以外ではトラバースでき
||ない可能性だってあります.
||----
||  whileループでダメな場合があるわけですね.
|そうです.むしろこっちを重視したいです.イテレータの本来の目
|的ですから.
|−−−−
|
| 昔,whileですべてOKとか習ったような気がするのですが.
| そんなループがあるのでしょうか?

えっと,ダイクストラの話ですね.確かにあらゆるアルゴリズムを
表現するために必要な制御構造は3つしかなくて,連接,条件分岐,
繰り返しだけがあればよいことが証明されています.

私のいっているのはそのことではなくて,あるクラス(自分で定義
したのではない)をトラバースする時に,whileでトラバースするた
めのメソッドが用意されていない可能性があるということです.も
ちろん自分でクラスを定義しなおせば良いことなのですが,面倒で
しょう?

In This Thread

Prev Next