2010-01-29 42 views
2

有沒有可能覆蓋紅寶石範圍內的點?我的目標是,在創建範圍之前操作給定的對象。如何覆蓋紅寶石範圍內的點?

我想到了這樣的事情

require 'rubygems' 
require 'active_support' 

#actual i have to call explicitly .to_date 
Date.today.to_date..1.month.since.to_date 

#this should give me a range with Date objects 
Date.today..1.month.since 

我已經嘗試覆蓋範圍類的初始化方法。但是這並沒有像預期的那樣奏效。

+0

你真的只需要指定它的第二個參數,因爲這是一個不是日期目的。 'Date.today..1.month.from_now.to_date' – 2010-01-31 02:45:10

回答

2

我剛看了一下MRI 1.8.7的源代碼,發現有點意外。長話短說,您可以覆蓋Range.initialize,但在初始化由.....運算符創建的範圍時,Ruby不會調用Range.initialize。我看不出有任何明顯的原因。速度,如果我不得不猜測。

+0

Sooo你需要做些什麼來重寫..和...? – fatuhoku 2016-11-02 12:13:19

+0

@fatuhoku我不認爲你可以覆蓋'..'和'...'。 – 2016-11-02 12:52:03

+0

好吧,真遺憾。無論如何,我還是爲此單獨提出了一個問題 - 以防萬一。 http://stackoverflow.com/questions/40380603/how-can-i-override-the-and-operators-of-ruby-ranges-to-accept-floatinfi – fatuhoku 2016-11-02 13:00:49

1

我知道你說你想覆蓋..是一個嚴格的要求還是你只是想?

以下爲您提供範圍內的日期對象數組。它可能無法處理所有情況並需要調整。我不知道爲什麼你會反對追求這樣的事情。

require 'active_support' 

def daterange(datestart,dateend) 
datearray = [] 
myrange = (datestart.to_date - dateend.to_date).to_i.abs 

myrange.times do |x| 
    datearray << datestart + x.day 
end 

datearray 

end 


puts daterange(Date.today,1.month.since) 
1

您可以通過重新定義initialize覆蓋的Range.new的行爲,但是這不會影響字面範圍:

class Range 
    alias_method :orig_init, :initialize 
    def initialize(b, e, *args) 
     orig_init(b * 10, e * 10, *args) 
    end 
end 

Range.new(1, 2) #=> 10..20 

1..2 #=> 1..2