Как перезаписать точки в рубиновом диапазоне? - PullRequest
2 голосов
/ 29 января 2010

Есть ли возможность перезаписать точки в рубиновом диапазоне? Моя цель - манипулировать данными объектами до того, как диапазон будет создан.

Я думал о чем-то подобном

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. Но это не сработало, как ожидалось.

Ответы [ 3 ]

2 голосов
/ 29 января 2010

Я только что взглянул на источник MRI 1.8.7 и обнаружил небольшую неожиданность. Короче говоря, вы можете переопределить Range.initialize, но Ruby не вызывает Range.initialize при инициализации диапазона, созданного с помощью оператора .. или .... Я не вижу никакой очевидной причины, по которой это было сделано. Скорость, если бы мне пришлось угадывать.

1 голос
/ 29 января 2010

Вы можете изменить поведение 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
1 голос
/ 29 января 2010

Я знаю, вы сказали, что хотите перезаписать .., это строгое требование или вы просто хотите?

Ниже приводится массив объектов даты в диапазоне. Это может не обрабатывать все случаи и требует настройки. Я не знаю, почему вы будете против того, чтобы заниматься чем-то вроде этого.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...