From: "岡 保嗣" Date: 2001-05-30T19:39:42+09:00 Subject: [ruby-list:29901] Re: module::method() と methid() の違いは ? 岡です。 > どういうエラーが出るんですか? > > とりあえず「このスクリプトではCntAccessが定義されていない」 > ことを除けばなんとなく動作するようですが。 すいません、しょっぱなからケアレスミスをしてしまいました。 推敲してるうちに間違えました。 スクリプトを書きなおしましたので、もう一度説明させてください。 (A)のように、CntAcc::init_cnt(sock) でモジュールの初期化しておくと、 (B)のsend_apmsg("ajaaja\n") では、@targetがnilなのでダメというエラーが出ま す。 test2.rb:18: warning: instance var @target not initialized Exception `NameError' at test2.rb:18 test2.rb:18:in `send_apmsg': undefined method `send_msg' for nil (NameError) from test2.rb:32 (B)をCntAcc::send_apmsg("ajaaja\n")と書きかえれば正常動作します。 CntAcc::send_apmsg() という書き方は、そのメソッドがどのモジュール内で定義さ れているか わかりやすくするための表記かと思っていました(今回はモジュールメソッドとして 定義してないから)。 include CntAccすれば、CntAcc::send_apmsg()とsend_apmsg()は同じ動作をすると 予想してたのですが、それがどうも違うようです。 それでどこをどう勘違いしてるのか教えていただきたいのです。 よろしくお願いします。 Rubyのバージョンはruby 1.4.6 (2000-08-16) [i686-linux] です。 ------------------------------------------------------ # 制御対象を示すクラス class Control def initialize(line) @control_line = line # 制御線 end def send_msg(msg) @control_line << msg # 制御線にmsgを送る end end # send_msgをレシーバ無しで使うためのモジュール module CntAcc def init_cnt(line) @target = Control.new(line) end def send_apmsg(msg) @target.send_msg(msg) end end require 'socket' include CntAcc sock = TCPSocket.new('localhost', 11110) # 相手はいるとして CntAcc::init_cnt(sock) # (A) send_apmsg("ajaaja\n") # (B)