2006年4月 9日

[ruby-list:41986] Re: Timeクラスの継承について

向井といいます。


エラーの原因を解説します。

super は親クラスを参照するものではなく、親(や祖先)クラスにある自分と同
名のメソッドを呼び出す仕組みです。また、 super の引数を省略した場合、
現在のメソッド呼び出しと同じ引数が与えられると解釈されます。


したがって、島津さんの例の
super.mktime(year, mon, day)
というのは、
Time.new(year, mon, day).mktime(year, mon, day)
と同じような意味です。

これは以下の点で誤りです。

1. Time.new は引数を取らないメソッドで、現在時刻を返すものなのに、3つ
の引数を与えている(直接のエラーメッセージはこれ)

2. Time.new で作成されたTimeオブジェクトにmktimeメソッドを与えようとし
ているが、実際には mktime は Time のクラスメソッドなのでおかしい

3. mktime は「新しいTimeクラスを作って返す」メソッドなので、呼出側には
何の影響もない


実際には、るびきちさんの言われるように特定のメソッドや定数を既存のクラ
スに直接に追加するのが楽だと思います。たとえば、

class Date
HOLIDAYS = {[1,1] => "元旦", ... }
def holiday?
HOLIDAYS.has_key?([self.mon, self.day])
end
def holiday_name
HOLIDAYS[[self.mon, self.day]]
end
end

とか……。

投稿者 xml-rpc : 2006年4月 9日 13:31
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/41836
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。