您定義了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
通過它的 「好」 的定義是什麼? – 2012-01-28 22:21:48
有什麼選擇?如果你從初始化中調用civil,你已經分配了一個你不需要的對象。 – pguardiario 2012-01-28 23:08:48
那麼,它分配和初始化一個對象在同一個方法似乎在語義上是錯誤的。我的意思是,如果'civil'事實上是'new',爲什麼不最終調用'initialize'呢?它可能是Date中的一個純形式,但它可以擴展這個類,而不需要真正的挖掘它的實現細節。因此,我想知道,爲什麼將「civil」變成「new」的決定可能已經完成了? – jst 2012-01-29 09:50:12