ruby - 为什么 Date.new 不调用初始化?

标签 ruby inheritance date

我想创建 Date 的子类。

一个正常的、健康的、年轻的 ruby​​ist,没有被 Date 的实现的特殊性所伤害,会以下面的方式来解决这个问题:

require 'date'

class MyDate < Date

  def initialize(year, month, day)
    @original_month = month
    @original_day = day

    # Christmas comes early!
    super(year, 12, 25)
  end

end

然后继续以最预期的方式使用它......

require 'my_date'

mdt = MyDate.new(2012, 1, 28)

puts mdt.to_s

... 只是因为 Date::new 方法实际上是 Date::civil 的别名,它永远 不会调用初始化。在这种情况下,最后一段代码打印“2012-01-28”而不是预期的“2012-12-25”。

亲爱的 Ruby 社区,这是什么鬼?

new 别名是否有一些很好的理由,以便它忽略 initialize,结果,是否有任何常识和对客户程序员心理健康的关注?

最佳答案

您定义了initialize,但是您使用new 创建了新实例。 new 返回类的一个新实例,而不是 initialize 的结果。

你可以这样做:

require 'date'

class MyDate < Date

  def self.new(year, month, day)
    @original_month = month
    @original_day = day

    # Christmas comes early!
    super(year, 12, 25)
  end

end

mdt = MyDate.new(2012, 1, 28)

puts mdt.to_s

备注: @original_month 和@original_day 在此解决方案中不可用。以下解决方案扩展了 Date,因此您可以访问原始月份和日期。对于正常日期,该值将为零。

require 'date'

class Date 
  attr_accessor :original_month 
  attr_accessor :original_day
end  

class MyDate < Date

  def self.new(year, month, day)

    # Christmas comes early!
    date = super(year, 12, 25)
    date.original_month = month
    date.original_day = day
    date
  end

end

mdt = MyDate.new(2012, 1, 28)

puts mdt.to_s
puts mdt.original_month

但我会推荐:

require 'date'

class MyDate < Date

  def self.create(year, month, day)
    @original_month = month
    @original_day = day

    # Christmas comes early!
    new(year, 12, 25)
  end

end

mdt = MyDate.create(2012, 1, 28)

puts mdt.to_s

require 'date'

class Date

  def this_year_christmas
    # Christmas comes early!
    self.class.new(year, 12, 28)
  end

end

mdt = Date.new(2012, 1, 28).this_year_christmas

puts mdt.to_s

关于ruby - 为什么 Date.new 不调用初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9049123/

相关文章:

javascript - 等待 ajax 请求完成

ruby-on-rails - rails : Rails_best_practices - command not found when run on a rails model

ruby - FactoryGirl 覆盖关联对象的属性

oop - 菱形继承(钻石问题)

在 C 中从年中日转换为月日

javascript - 在javascript中从周数和年份获取星期五

javascript - javascript 中 Uncaught ReferenceError

inheritance - 在序言中定义 is_a 谓词?

C++构造函数继承

java - 使用 Criteria 根据时间段从数据库获取对象?