2 Stimmen

Wie kann man die Punkte in einem Ruby-Bereich überschreiben?

Gibt es eine Möglichkeit, die Punkte in einem Ruby-Bereich zu überschreiben? Mein Ziel ist es, die angegebenen Objekte zu manipulieren, bevor der Bereich erstellt wird.

Ich dachte an etwas wie dieses

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

Ich habe bereits versucht, die Initialisierungsmethode der Klasse Range zu überschreiben. Aber das hat nicht wie erwartet funktioniert.

0 Stimmen

Sie müssen nur das zweite Argument angeben, da es sich dabei um dasjenige handelt, das kein Date-Objekt ist. Date.today..1.month.from_now.to_date

2voto

Wayne Conrad Punkte 95828

Ich habe gerade einen Blick auf den Quellcode von MRI 1.8.7 geworfen und eine kleine Überraschung gefunden. Lange Rede kurzer Sinn, man kann die Range.initialize auf, aber Ruby ruft nicht Range.initialize beim Initialisieren eines Bereichs, der mit der Methode .. o ... Betreiber. Ich kann keinen offensichtlichen Grund erkennen, warum das so gemacht wurde. Geschwindigkeit, wenn ich raten müsste.

1voto

Beanish Punkte 1632

Ich weiß, Sie sagten, Sie wollen die .. Ist das eine strenge Vorschrift oder wollen Sie das nur?

Im Folgenden erhalten Sie ein Array von Datumsobjekten im Bereich. Es kann sein, dass es nicht alle Fälle abdeckt und angepasst werden muss. Ich weiß nicht, warum Sie etwas dagegen haben, so etwas zu tun.

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)

1voto

horseyguy Punkte 28632

Sie können das Verhalten von Range.new durch Neudefinition initialize aber dies hat keine Auswirkungen auf den wörtlichen Bereich:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X