まつもと ゆきひろです
In message "[ruby-list:12661] Re: alternative name of iterator"
on 99/03/09, moochan <moochan / ss.hitachizosen.co.jp> writes:
|ええ.確かに手続きオブジェクトとSmallalkのブロックはよく似ています.
|でも今話題にしているのは,手続きオブジェクトではなくイテレータです.
|イテレータとSmalltalkのブロックは同じとは思えません.
|
|# イテレータ != 手続きオブジェクト ですよね.
ええ,その通りです.同じところもありますが,違うところもあり
ます(でも「必要なら何度も繰り返し評価される」って点について
は,Smalltalkブロック/Rubyブロック/手続きオブジェクトすべて
に共通だと思います).
また,Smalltalkのブロックに対応するのはRubyのブロックではな
く,手続きオブジェクトであるという点についてもその通りです.
|表現が過激でしたね.すみません.(^^;;;
いや,表現については気にしていません.ただ,私にはそのような
過激な表現を招くなにかが良く分からなかったので,お尋ねしてい
るのです.
|>それってRubyのブロックがそういうイメージがあるってことですか?
|
|イテレータは本来レシーバに任せるべき手続きをセンダー側で定義し実行し
|てしまう機能ですよね.そのとき対象となるオブジェクトはレシーバから取
|ってくるイメージがあります.そういう意味で先の過激な印象になってしま
|ったんですね.
そうなんですか? 私のとは違ったイメージですね.
私はSmalltalkブロック(オブジェクト)とRubyブロック(非オブジェ
クト)の本質的違いは
* それ自体がオブジェクトかどうか
しかない(で,オブジェクト化すると手続きオブジェクトになる)と
思ってます.
|それから Smalltalk のブロックは,レシーバからの独立性が高いですがイ
|テレータの場合低いように思います.
|用途の違いも顕著です.イテレータはコレクション系クラス,Smalltalkの
|ブロックは Boolean オブジェクトへのセレクタメッセージとしてよく用い
|られます.
それはifTrue:ifFalse:のせいではないですか? つまり,Rubyのイ
テレータの仕様のせいではなく,Rubyにはちゃんとした(普通の)制
御構造があるので,そういう目的にブロックを使う必要がないと.
で,そういう目的でない使い方であるコレクション系クラスには残っ
たと思います.
|>これはSmalltalkもRubyも両方そうなのでは? 両方とも現在のコン
|
|定義と言う意味では同じでしょうね.ただ評価する場所は異なりますが.
Rubyもメソッドの内部で評価してるんですよ.
|「コンテキストを変更してブロックを評価するメソッド」の具体的なイメージが
|湧かないのですが,アセンブラやCでよくやるコードでコードを書き換えるってや
|つですか?
たとえば,instance_evalなんかそうですね.
@foo # selfのインスタンス変数@foo
bar.instance_eval{@foo} # barのインスタンス変数@foo
ここでブロック内のコンテキストの一部(self)が書き変わってるわ
けです.かなり反則ですね.
まつもと ゆきひろ /:|)