From: masaki Date: 2002-07-19T18:30:12+09:00 Subject: [ruby-dev:17719] Re: self in block 正木です。 From: Minero Aoki Subject: [ruby-dev:17715] Re: self in block Date: Fri, 19 Jul 2002 14:25:11 +0900 > > > 問題は initialize に渡される block のように、いつどこで呼ばれるかあらかじめ > > 分からない場合で、従来の仕様だと self も不定(大抵は main ですが)で使いようが > > 無いし、変数の scope も問題があります。 > > すみません、「self が不定」という点がさっぱりわかりません。self > が不定だったらプログラムは書けません。また「たいていは main」は > 嘘だと思います。普通のオブジェクト指向なプログラムだったら self > は main 以外のほうが圧倒的に多くなります。 initialize の code を書いている時点では不定と言う意味です。勿論呼ばれた 時点での context で self は決まります。 Sequence の設計を色々試していた時の test 結果が、殆んど main だったので、 つい筆がすべりました。無視してください。 私は従来の block との併用を考えているので、上で言っているのは、どういう context で使われるかが前もって分からない特殊な case での話です。 > > それと「ブロック」はイテレータは含むんですか? 含むとしたら > めちゃくちゃ嫌です。ブロックを定義する側からまったく情報を > 渡せなくなるわけで、それこそ使いようがありません。 > イテレータに対しては今まで通りの仕様を使えば良いのでは? > なんとなく、「関数が欲しい」というのが真の意図のような気が > するのですが…… これはその通りです。名前を付ける必要がない関数が欲しいわけです。 > > > > 私の(妥協案でない)本音の提案は以下の通りです: > > > > 従来の仕様から block 内 local 変数をはずす。 > > (これは仕様がすっきりするというだけの理由です。) > > > > 逆に新しい仕様ではすべての local 変数を block 内 local 変数にする。正確には: > > object.method(){ ...} > > の形のときは local 変数の scope は block 内に限定される。 > > self はこれを呼び出した object を指す。 > > ……ということはやっぱりイテレータも入るんでしょうね。 > それならやはり「絶対」反対です。 > イテレータに対して新しい仕様を使う必要は殆んどないだろうと思っています。 > ローカル変数はブロックローカル限定、までは個人的には同意できる > 面もありますが、self を変えてしまうのはどうにも理解できません。 > self が変わるということは呼べるメソッドからインスタンス変数から > あらゆる環境が変わるということです。self はできるだけ静的に決定 > するのが望ましい姿でしょう。 > object.method(){ ...} で呼ばれる method の定義 def method(...) ... end のなかでは self はこの method を呼んだ object を指すわけですから block 内の self が別の物を指す方が不自然な気がします。 > しかも、正木さんのやりたいことはなにも self を変えてしまわなく > とも、(立石さんがおっしゃるように) 別の名前を導入しても可能なの > ですからなおさらです。たとえば caller とかがふさわしいのでは > ないでしょうか。 > > > ただ、いずれにしてもぼくはそういう機能には反対します。 > > オブジェクトへのリンクを持っているということはメソッドを呼べる > ということです。そしてメソッドを呼ぶというのは「それが必要だ」 > という表明です。ましてや言語レベルでリンクを提供するのならば、当 > のオブジェクトにとってかなりの関連性や必然性がなければいけない > はずです。ですが caller と callee のオブジェクト同士にそれほど > 強い関係や結びつきがあるとは思えません。むしろ勝手に記憶されたく > ない場合のほうが多いのではないでしょうか? > ------------------------------------------------------------------- > ここの所は全く理解できません。 できれば caller について分かりやすく説明していただけると助かります。 参考のためにお聞きしますが、青木さんが現在の block の仕様に不満があると したら、それは何ですか? 従来通りの使い方をしている分には何の影響も無いわけで、青木さんが何故 そんなに反対するのか不可解です。 (従来の仕様から block 内 local 変数をなくすというのは互換性の問題で実際 には採用されないと思います。)