須賀です。

> Yet Another Date クラスの名前をそろそろ決めたいのですが、When だと
> 予約語と紛らわしいから、やはりまずいですよね。 

その後考えたのですが、まずいのは「ユーザが直接'When'という名前を使わ
ねばならないとすれば予約語と紛らわしい」ということだと思います。


When クラスを標準添付の Date クラスのサブクラスにして、when.rbを

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
class Date
  def Date.local([暦法名,]y,m,d,...)
    DateクラスまたはWhenクラスのインスタンスを作って返す
   (タイムゾーンはローカル)
   date = ...
   When.return_date_or_when(date)
  end

  def Date.utc([暦法名,]y,m,d,...)
    DateクラスまたはWhenクラスのインスタンスを作って返す
   (タイムゾーンはグリニジ標準時)
   date = ...
   When.return_date_or_when(date)
  end

  def to_when DateオブジェクトをWhenオブジェクトに変換して返す end
  def new_calendar(cal)  to_when % cal    end; alias_method :%, :new_calendar
  def new_zone(zone)     to_when | zone   end; alias_method :|, :new_zone
  def new_period(period) to_when / period end; alias_method :/, :new_period

  def jdn ... end # これらの計算は Date クラスで閉じる。一部は既定義のものの別名
  def jdf ... end #   〃
  def sd  ... end #   〃
  def sdn ... end #   〃
  def sdf ... end #   〃

  alias_methld :+!, :+
  def +(other)
    return +!(other) unless other === String
    return to_when + other
  end 
    
  alias_methld :-!, :-
  def -(other)
    return -!(other) unless other === String
    return self.to_when - other
  end 
end

class When < Date
  def When.return_date_or_when(date)
    (諸々のメソッドの終わりで日付オブジェクトを返すときに呼ばれて)
    When オブジェクト date の date.cal が Civil で、date.zone が
    固定タイムゾーンのときは date を Date クラスのオブジェクトに
    変換して返す。とちらかの条件が成立しないときには、When クラス
    のオブジェクトをそのまま返す。
  end
  ...

end  
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
と定義して、date.rb の後からインクルードするようにすれば、

1. ユーザが When という名前を直接使うことはまずない。
2. それにもかかわらずユーザは yet another date の全機能を使える。
   (現状でも遅い速度がさらに若干低下する,しかしもともと五十歩百歩)
3. when.rb の require(実際には大部分の機能は autoload になっているので必要にな
   るまでロードされない) と +,- 演算でのString型判定のわずかなオーバーヘッドの
   増加を除けば、既存の date クラスの機能のみを使う分には速度は低下しない。
   もちろん when.rb を使わなければ、何の関係もない。
4. 将来 標準添付の date クラスのメソッド名が変更になっても、名前が衝突しない限
   り when.rb には影響がおよばない。

が実現できます。

yet another date のクラス名は When でも良いでしょうか?
-- 
////////// 須賀 隆 ///////////////////////// SGB02104 / nifty.com ////////
// http://www.asahi-net.com/~dd6t-sg/ mailto:suchowan / box.email.ne.jp //