我想创建 Date 的子类。
一个正常的、健康的、年轻的 rubyist,没有被 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/