如何覆盖红宝石范围内的点?

时间:2010-01-29 15:18:35

标签: ruby range

是否有可能覆盖红宝石范围内的点?我的目标是在创建范围之前操纵给定的对象。

我想到了这样的事情

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

我已经尝试覆盖Range类的initialize方法。但这并没有像预期的那样奏效。

3 个答案:

答案 0 :(得分:2)

我刚看了一下MRI 1.8.7来源,发现有点意外。简而言之,您可以覆盖Range.initialize,但在初始化使用Range.initialize..运算符创建的范围时,Ruby不会调用...。我看不出有任何明显的理由这样做。速度,如果我不得不猜测。

答案 1 :(得分: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)

答案 2 :(得分:1)

您可以通过重新定义Range.new来覆盖initialize的行为,但这不会影响范围字面值:

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