Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Ruby] Superclass Method Call while Initializing

6 views
Skip to first unread message

Jun Adachi

unread,
Mar 30, 1998, 3:00:00 AM3/30/98
to

安達沖デヌタず申したす。

ruby 1.1b9(98/02/27) [i386-freebsd2.2.5]を利甚させおもらっおいるのです
が、ちょっず小石にけ぀たずいた気がしたので報告させお頂きたす。

ごめんなさい、コヌドがあるのでちょっず長いです。

rubyに関しおは、党くの初心者なので緎習問題ずしお、蚭定ファむルを読むク
ラスにチャレンゞしお芋たした。単玔に、初期化メ゜ッド䞭でファむルを読み
蟌む簡単なもののはずだったのですが、、、

-[ conf0.rb ]--------------------------------------------------------------
#!/usr/local/bin/ruby

class Conf < Hash
def initialize (name)
IO.foreach (name) {
next if /^$/o;
next if /^[ \t]*#/o;
$_.chomp!;
entry = split(/[ \t]+/);
self[entry[0]] = entry[1];
}
end
end

$conf = Conf.new("./test.conf");

$conf.each_pair {
| k, v |
print "key=#{k}, value=#{v}\n";
}
---------------------------------------------------------------------------

これを実行しおも、䜕も出力しないんですよね。次のように、初期化では読み
蟌みの凊理を行わず、readずいうメ゜ッドを䜜っお呌び出しおやるずうたく動
くようです。

-[ conf1.rb ]--------------------------------------------------------------
#!/usr/local/bin/ruby

class Conf < Hash
def initialize
super;
end

def read (name)
self[".notdef"] = "NOT DEFINED";
File.foreach (name) {
next if /^$/o;
next if /^[ \t]*#/o;
$_.chomp!;
entry = split(/[ \t]+/);
self[entry[0]] = entry[1];
}
end
end

$conf = Conf.new;
$conf.read("./test.conf");

$conf.each_pair {
| k, v |
print "key=#{k}, value=#{v}\n";
}
---------------------------------------------------------------------------

どうも初期化のメ゜ッドを抜けおからでないず呌出が無芖されおいるような感
じです。初心者の私が芋萜ずしおいるTIPSがあるんでしょうかそれずも、こ
のような仕様なんでしょうか

これが仕様ならば、できればコンパむル時の゚ラヌにしお欲しいのですけど。
--
*------* ada...@okidata.co.jp
|人∧鷲| 沖デヌタ 第䞀研究所
| <女> | 安達 淳
|牛∹獅|
*------*


Yukihiro Matsumoto

unread,
Apr 2, 1998, 3:00:00 AM4/2/98
to

た぀もず ゆきひろです

ada...@tpegasus.lab.okidata.co.jp (Jun Adachi) writes:

|安達沖デヌタず申したす。
|
|ruby 1.1b9(98/02/27) [i386-freebsd2.2.5]を利甚させおもらっおいるのです
|が、ちょっず小石にけ぀たずいた気がしたので報告させお頂きたす。

結論から先にいうずHashのnewがinitializeを呌ばないのが原因で
すこれはmisfeatureず呌んでも良いように思いたす

1.1b0以降では修正するように怜蚎したす

Jun Adachi

unread,
Apr 3, 1998, 3:00:00 AM4/3/98
to

安達沖デヌタです。

た぀もずさん、皲葉さん、どもこんにちは。

In article <7sbtukb...@sdd.tokyo-sc.toshiba.co.jp>
Inaba Hiroto <in...@sdd.tokyo-sc.toshiba.co.jp> writes:

initializeメ゜ッドそのものが呌ばれおないようです. すくなくずも
ruby 1.1b9でHashやArrayやStringのsubclassではnewした時にinitializeメ゜ッ
ドは呌んでくれないようです.

「やっぱりぃっっっ!」぀う感じです。

Hashのsubclassにしないで, 以䞋のようにむンスタンス倉数にHashを持぀よう
にするか,

(略)

うヌん。これをやるず、def xxx; @hash.xxx; endだけにしろ、いろいろず定
矩しないずいけないんで、いやなんですよ。(<- 単なるわがたた)

あるいは, Hashのsubclassにするなら,

class Conf < Hash
def Conf.new(name)
me = super()
File.foreach (name) {
<略>
me[entry[0]] = entry[1]
}
return me
end
end

(略)

む。Conf.newを曞き換えおしたうわけですか。いろいろずやりたしたが、これ
には思い至りたせんでした。ずりあえずは、これをたねさせお頂きたす。

newず違っおinitializeはむンスタンスを返さないので、スヌパヌクラスのnew
ずinitializeが、どこで行われおいるかがよヌわからんのでした。

ただ、newの眮き換えで党郚解決するずなるず、「initializeの立堎っお」
ずか、「サブクラスっお、rubyの堎合はクラス名の゚むリアスむンスタンス
倉数」ずか疑問が湧いお来おしたいたす。

いえ、だからどうだずいえるだけの知識も経隓もなく、単に珟状を理解した
いだけなのですが。

In article <lvhg4cd...@picachu.netlab.co.jp>
Yukihiro Matsumoto <ma...@netlab.co.jp> writes:

た぀もず ゆきひろです

(略)

結論から先にいうずHashのnewがinitializeを呌ばないのが原因で
すこれはmisfeatureず呌んでも良いように思いたす

1.1b0以降では修正するように怜蚎したす

䜜者じきじきのご返事、ありがずうございたす。

修正予定に加えお頂けるずいうこずで、䞊に曞いたような疑問に、私ら䞀般庶
民:-)は、たぁったく頭を䜿う必芁なさそうでうれしいです。

今埌も䞋んない質問をするかも知れたせんが、よろしくお願い臎したす(_O_)。

次のバヌゞョン、Ruby本の出版、ずもに銖をうにうにず䌞ばしおおりたす。

Yukihiro Matsumoto

unread,
Apr 3, 1998, 3:00:00 AM4/3/98
to

た぀もず ゆきひろです

ada...@tpegasus.lab.okidata.co.jp (Jun Adachi) writes:

|安達沖デヌタです。

| Hashのsubclassにしないで, 以䞋のようにむンスタンス倉数にHashを持぀よう
| にするか,

|うヌん。これをやるず、def xxx; @hash.xxx; endだけにしろ、いろいろず定
|矩しないずいけないんで、いやなんですよ。(<- 単なるわがたた)

そんなあなたにdelegate.rbが

require 'delegate' # ここず
class Conf<SimpleDelegator # ここず
def initialize (name)
@hash = {}
File.foreach (name) {
<略>
@hash[entry[0]] = entry[1]
}
super(@hash) # ここが違う
end
end

コレだけでConfにはHashの党メ゜ッドが远加されたす
# あでも1.1b9_05たでのdelegate.rbにはむテレヌタを呌べない
# ず蚀うバグが 

|む。Conf.newを曞き換えおしたうわけですか。いろいろずやりたしたが、これ
|には思い至りたせんでした。ずりあえずは、これをたねさせお頂きたす。

Conf.newを曞き換えるっおのはサブクラスを䜜る時に砎綻するこず
が倚いんでお勧めしおたせんが今回はしょうがないですね

| 結論から先にいうずHashのnewがinitializeを呌ばないのが原因で
| すこれはmisfeatureず呌んでも良いように思いたす
|
| 1.1b0以降では修正するように怜蚎したす

ここは1.1c0の間違いですもう修正しちゃいたしたからそろそ
ろ出る実隓リリヌスの1.1b9_07では採甚されおたす
# っお実隓リリヌスのこずをこんなに倧々的に曞いお良いのか

た぀もず ゆきひろ /:|)

Jun Adachi

unread,
Apr 6, 1998, 3:00:00 AM4/6/98
to

安達沖デヌタです。

In article <lvemzfc...@picachu.netlab.co.jp>
Yukihiro Matsumoto <ma...@netlab.co.jp> writes:

た぀もず ゆきひろです

再床の埡教瀺ありがずうございたす。

ada...@tpegasus.lab.okidata.co.jp (Jun Adachi) writes:

|うヌん。これをやるず、def xxx; @hash.xxx; endだけにしろ、いろいろず定
|矩しないずいけないんで、いやなんですよ。(<- 単なるわがたた)

そんなあなたにdelegate.rbが

「おぉぉぉヌ。俺は猛烈にカンドヌしおいるっっっ」

昚日、挫画喫茶で「バスタヌド」既刊党郚を読んで来た物で、衚珟が倧げさ
になっおおりたす。

ただ、蚀語暙準のモゞュヌルクラスすら手探りの状況なんで、添付されおい
たラむブラリの方は、党然チェックしおいないのでした。

あぁ、やはりRuby本が埅ち遠しい。

コレだけでConfにはHashの党メ゜ッドが远加されたす
# あでも1.1b9_05たでのdelegate.rbにはむテレヌタを呌べない
# ず蚀うバグが 

むむむ。HashやArrayのサブクラスずしおは、キョヌレツな制玄なのでは、、、

Conf.newを曞き換えるっおのはサブクラスを䜜る時に砎綻するこず
が倚いんでお勧めしおたせんが今回はしょうがないですね

ずいうこずで、やはり圓面はこちらのようですね。ずりあえずは、あれにサブ
クラスを䜜る必芁はないですから。

| 結論から先にいうずHashのnewがinitializeを呌ばないのが原因で
| すこれはmisfeatureず呌んでも良いように思いたす
|
| 1.1b0以降では修正するように怜蚎したす

ここは1.1c0の間違いですもう修正しちゃいたしたからそろそ
ろ出る実隓リリヌスの1.1b9_07では採甚されおたす
# っお実隓リリヌスのこずをこんなに倧々的に曞いお良いのか

えヌっず、これは実隓リリヌステスト参加のお誘いでしょか:-)

今回のやりずりを、Q&A圢匏でたずめおみたした。添削をお願いしたす。
--
Q. あるクラスのむンスタンス倉数ずしお、ArrayやStringなどの倚くのメ゜ッ
ドをも぀クラスのオブゞェクトを定矩しおいたす。そのむンスタンス倉数のた
めに、これらのクラスが持っおいる手続きすべおを再定矩する必芁があるので
しょうか

A. そんなあなたには、暙準配垃パッケヌゞに含たれおいるdelegate.rbがあり
たす。䟋えば、むンスタンス倉数ずしお@hashをも぀クラスConfの堎合、次の
ように蚘述したす。

require 'delegate' # delegateの利甚宣蚀

class Conf<SimpleDelegator # SimpleDelegatorのサブクラスずしお定矩


def initialize (name)
@hash = {}

<略> # @hashの初期化などを蚘述しお䞋さい
super(@hash) # @hashのメ゜ッドをselfに登録
end
end

コレだけでConfにはHashのクラスメ゜ッド(ex. initialize)を陀く、党メ゜ッ
ドが远加されたす。

Yukihiro Matsumoto

unread,
Apr 6, 1998, 3:00:00 AM4/6/98
to

た぀もず ゆきひろです

ada...@tpegasus.lab.okidata.co.jp (Jun Adachi) writes:

|安達沖デヌタです。

| そんなあなたにdelegate.rbが


|
|「おぉぉぉヌ。俺は猛烈にカンドヌしおいるっっっ」
|
|昚日、挫画喫茶で「バスタヌド」既刊党郚を読んで来た物で、衚珟が倧げさ
|になっおおりたす。

「鈎朚土䞋座ェ門」ですか ^^;;;

|あぁ、やはりRuby本が埅ち遠しい。

ちょい遅れおたすすいたせん

| # あでも1.1b9_05たでのdelegate.rbにはむテレヌタを呌べない
| # ず蚀うバグが 
|
|むむむ。HashやArrayのサブクラスずしおは、キョヌレツな制玄なのでは、、、

もう盎したしたから勘匁しお䞋さい

|えヌっず、これは実隓リリヌステスト参加のお誘いでしょか:-)

ご参加は倧歓迎したすその堎合 ruby-dev メヌリングリストにも
入っお頂けるずもっず嬉しいです

|今回のやりずりを、Q&A圢匏でたずめおみたした。添削をお願いしたす。

すいたせん助かりたす

|コレだけでConfにはHashのクラスメ゜ッド(ex. initialize)を陀く、党メ゜ッ
|ドが远加されたす。

実際はConfで定矩されおいるメ゜ッドず名称が衝突しないHashの党
メ゜ッドですあずidずequal?ず__getobj__も远加したせん

それからinitializeはクラスメ゜ッドではなくむンスタンスメ゜ッ
ドですクラスメ゜ッドnewから間接的に呌ばれおいるだけです

た぀もず ゆきひろ /:|)

Jun Adachi

unread,
Apr 7, 1998, 3:00:00 AM4/7/98
to

安達沖デヌタです。

ようやく、䜜り損ねおいたらしいfj.lang.rubyを䜜っおもらいたした。

In article <lvd8evc...@picachu.netlab.co.jp>
Yukihiro Matsumoto <ma...@netlab.co.jp> writes:

た぀もず ゆきひろです

(略)

「鈎朚土䞋座ェ門」ですか ^^;;;

Unix環境ですず、rogue, hack, nethackで出お来おたすな。最近は、Windows
の䞊のむンタヌネット環境にもいるそうです。どれも、'e'をシンボルずしお
いお、ぞたに觊るず凍っお動かなくなる匷悪さを共有しおいたす。Microsoft
には、「バスタヌド」の愛読者が倚いんでしょうか:-P

Windows䞊の奎もみんなで「鈎朚土䞋座ェ門」ず呌んであげよう(^_^)

ada...@tpegasus.lab.okidata.co.jp (Jun Adachi) writes:

|えヌっず、これは実隓リリヌステスト参加のお誘いでしょか:-)

ご参加は倧歓迎したすその堎合 ruby-dev メヌリングリストにも
入っお頂けるずもっず嬉しいです

はぁ、䜕ができるか今䞀぀䞍安ではありたすが、連絡先など教えお䞋さいたせ。

|コレだけでConfにはHashのクラスメ゜ッド(ex. initialize)を陀く、党メ゜ッ
|ドが远加されたす。

実際はConfで定矩されおいるメ゜ッドず名称が衝突しないHashの党
メ゜ッドですあずidずequal?ず__getobj__も远加したせん

あぁ、やはり勝手に想像でもの蚀っおはいけんですね。これで、すっきりです。

それからinitializeはクラスメ゜ッドではなくむンスタンスメ゜ッ
ドですクラスメ゜ッドnewから間接的に呌ばれおいるだけです

うヌん。私の䞍勉匷がばれおたすねぇ。

Q&A圢匏第版。


--
Q. あるクラスのむンスタンス倉数ずしお、ArrayやStringなどの倚くのメ゜ッ
ドをも぀クラスのオブゞェクトを定矩しおいたす。そのむンスタンス倉数のた
めに、これらのクラスが持っおいる手続きすべおを再定矩する必芁があるので
しょうか

A. そんなあなたには、暙準配垃パッケヌゞに含たれおいるdelegate.rbがあり
たす。䟋えば、むンスタンス倉数ずしお@hashをも぀クラスConfの堎合、次の
ように蚘述したす。

require 'delegate' # delegateの利甚宣蚀

class Conf<SimpleDelegator # SimpleDelegatorのサブクラスずしお定矩
def initialize (name)
@hash = {}
<略> # @hashの初期化などを蚘述しお䞋さい
super(@hash) # @hashのメ゜ッドをselfに登録
end
end

コレだけで、Confで定矩したメ゜ッドず名前の衝突しないHashの党メ゜ッドが、
Confのむンスタンスで利甚可胜になりたす。ただし、䟋倖ずしおid, equal?及
びSimpleDelegator内郚で定矩しおいる__getobj__がありたす。id, equal?は、
Objectで定矩されおいる、最も基本的なメ゜ッドであっおDelegatorを䜿甚し
なくおも利甚可胜ずなっおいたす。
--
ここでさらに、「なぜdelegateがObjectのメ゜ッドずしお実装されおいない
のですか」ずか「耇数のむンスタンス倉数のメ゜ッドをdelegateしようず
したのですがうたくいきたせん」ずか問を続けるず、Mixinの方に話がいっ
お、頭から読んで理解できるFAQの䞀郚になったりするのでしょうか。

Yukihiro Matsumoto

unread,
Apr 7, 1998, 3:00:00 AM4/7/98
to

た぀もず ゆきひろです

ada...@tpegasus.lab.okidata.co.jp (Jun Adachi) writes:

|安達沖デヌタです。

| |えヌっず、これは実隓リリヌステスト参加のお誘いでしょか:-)


|
| ご参加は倧歓迎したすその堎合 ruby-dev メヌリングリストにも
| 入っお頂けるずもっず嬉しいです
|
|はぁ、䜕ができるか今䞀぀䞍安ではありたすが、連絡先など教えお䞋さいたせ。

その気になりたしたら ruby...@netlab.co.jp たでメヌルを䞋さ
い内容は自己玹介ずかいかがでしょう実際にはなんでも構いた
せんケドruby-devではrubyの仕様倉曎やバグ実隓版に関する話
題などが取り扱われおいたすちなみにrubyに関する䞀般的な話題
を扱うメヌリングリスト ruby-listずいうのもありたすこちらは
ruby...@netlab.co.jpたでメヌルをこちらも内容は問いたせん

|コレだけで、Confで定矩したメ゜ッドず名前の衝突しないHashの党メ゜ッドが、
|Confのむンスタンスで利甚可胜になりたす。ただし、䟋倖ずしおid, equal?及
|びSimpleDelegator内郚で定矩しおいる__getobj__がありたす。id, equal?は、
|Objectで定矩されおいる、最も基本的なメ゜ッドであっおDelegatorを䜿甚し
|なくおも利甚可胜ずなっおいたす。

より正確に蚀えば(し぀こくおごめんなさい)id ず equal? はオ
ブゞェクトを同定する基本的なメ゜ッドなので転送すべきでないか
らこのようになっおたすこれらたで転送しちゃうず転送元のオ
ブゞェクトがなにものだか分からなくなっちゃうからです実際は
他にも転送しちゃいかんメ゜ッドはあるような気もしたすがおい
おい远加しようず思いたす(いい加枛な奎 ^^;;;)

た぀もず ゆきひろ /:|)

Jun Adachi

unread,
Apr 8, 1998, 3:00:00 AM4/8/98
to

安達沖デヌタです。

いや、どうも现かいずころに気が回りたせんで、䜕床もお手間ずらせたす。

In article <lv90pic...@picachu.netlab.co.jp>
Yukihiro Matsumoto <ma...@netlab.co.jp> writes:

た぀もず ゆきひろです

ada...@tpegasus.lab.okidata.co.jp (Jun Adachi) writes:

|安達沖デヌタです。

|はぁ、䜕ができるか今䞀぀䞍安ではありたすが、連絡先など教えお䞋さいたせ。

その気になりたしたら ruby...@netlab.co.jp たでメヌルを䞋さ
い内容は自己玹介ずかいかがでしょう実際にはなんでも構いた
せんケドruby-devではrubyの仕様倉曎やバグ実隓版に関する話
題などが取り扱われおいたすちなみにrubyに関する䞀般的な話題
を扱うメヌリングリスト ruby-listずいうのもありたすこちらは
ruby...@netlab.co.jpたでメヌルをこちらも内容は問いたせん

いきなり、devでは敷居が高そうなんで、たずはlistの方に参加するこずにし
たす。これに関しおは、たた埌皋メヌルにお。

|コレだけで、Confで定矩したメ゜ッドず名前の衝突しないHashの党メ゜ッドが、
|Confのむンスタンスで利甚可胜になりたす。ただし、䟋倖ずしおid, equal?及
|びSimpleDelegator内郚で定矩しおいる__getobj__がありたす。id, equal?は、
|Objectで定矩されおいる、最も基本的なメ゜ッドであっおDelegatorを䜿甚し
|なくおも利甚可胜ずなっおいたす。

より正確に蚀えば(し぀こくおごめんなさい)id ず equal? はオ
ブゞェクトを同定する基本的なメ゜ッドなので転送すべきでないか
らこのようになっおたす

そうだろうずは想像しおたんですが、そういうのをFAQレベルのナヌザ(->自分
もだろ)に蚀っおもよいのかなず躊躇した結果でした。芋盎すず確かに倉で
すね。

これらたで転送しちゃうず転送元のオ
ブゞェクトがなにものだか分からなくなっちゃうからです実際は
他にも転送しちゃいかんメ゜ッドはあるような気もしたすがおい
おい远加しようず思いたす(いい加枛な奎 ^^;;;)

ただ、増える可胜性もあるのですね。じゃぁ、あくたでFAQの䞭では䟋瀺に止
める圢にしお、、、

この話題FAQ第3版(だったっけ)


--
Q. あるクラスのむンスタンス倉数ずしお、ArrayやStringなどの倚くのメ゜ッ
ドをも぀クラスのオブゞェクトを定矩しおいたす。そのむンスタンス倉数のた
めに、これらのクラスが持っおいる手続きすべおを再定矩する必芁があるので
しょうか

A. そんなあなたには、暙準配垃パッケヌゞに含たれおいるdelegate.rbがあり
たす。䟋えば、むンスタンス倉数ずしお@hashをも぀クラスConfの堎合、次の
ように蚘述したす。

require 'delegate' # delegateの利甚宣蚀

class Conf<SimpleDelegator # SimpleDelegatorのサブクラスずしお定矩
def initialize (name)
@hash = {}
<略> # @hashの初期化などを蚘述しお䞋さい
super(@hash) # @hashのメ゜ッドをselfに登録
end
end

コレだけで、Confで定矩したメ゜ッドず名前の衝突しないHashの党メ゜ッドが、
Confのむンスタンスで利甚可胜になりたす。ただし、delegateされないメ゜ッ
ドもありたす。それには、Delegator及びそのサブクラスで利甚しおいるメ゜ッ
ドず、id, equal?などのようにそもそもdelegateを行っおはたずいものに分類
できたす。詳现に関しおは、お手持ちのdelegate.rbを参照しお確かめお䞋さい。

0 new messages