是否有可能覆盖红宝石范围内的点?我的目标是在创建范围之前操纵给定的对象。
我想到了这样的事情
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方法。但这并没有像预期的那样奏效。
答案 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