あおきです。

  In mail "[ruby-list:21655] Re: net-1.1.10"
    じぶん wrote:

> > error_type はインスタンス変数に代入しているだけみたいなんですが、
> > クラス定義の中でそれをやるのって意味があるんでしょうか。
> 
> 意味はあります。クラスはインスタンス変数を持てるので、たとえば
(略)
> は ok を表示します。まずかったのは、継承してるのに @err を
> 再設定していなかったことです。
> 再設定してもいいですが、もっと美しい(変更が小さい)方法としては
> 添付のパッチのような方法があります。

すみません、偉そうに書いておきながら間違ってました。再パッチ。
関係なさそうな部分は smtp のほうに関するものです。
-------------------------------------------------------------------
あおきみねろう

Index: protocol.rb =================================================================== RCS file: /home/aamine/cvs/maillib/protocol.rb,v retrieving revision 1.2.2.3 diff -u -r1.2.2.3 protocol.rb --- protocol.rb 2000/03/26 16:34:47 1.2.2.3 +++ protocol.rb 2000/03/27 09:13:07 @@ -15,7 +15,7 @@ module Net - Version = '1.1.10' + Version = '1.1.11' =begin @@ -226,6 +226,7 @@ @socket = sock @error_occured = false @last_reply = nil + @critical = false end attr_reader :socket, :error_occured, :last_reply @@ -267,6 +268,16 @@ check_reply ok end + def critical + @critical = true + yield + @critical = false + end + + def critical? + @critical + end + end @@ -281,14 +292,23 @@ class ReplyCode + ERROR_TYPE = {} + class << self def error_type( err ) - @err = err + ::Net::ReplyCode::ERROR_TYPE[ self ] = err end def error!( mes ) - raise @err, mes + c = self + h = ::Net::ReplyCode::ERROR_TYPE + er = nil + until er = h[c] do + c = c.superclass + raise NameError, 'bug of net/protocol.rb' if c == Object + end + raise er, mes end end