2010-09-16 5 views
7

Ich habe diese Methode gefunden here.Ruby, erhalten Stunden, Sekunden und Zeit von Date.day_fraction_to_time

start = DateTime.now 
    sleep 15 
    stop = DateTime.now 
    #minutes 
    puts ((stop-start) * 24 * 60).to_i 

    hours,minutes,seconds,frac = Date.day_fraction_to_time(stop-start) 

Ich habe folgende Fehlermeldung:

`<main>': private method `day_fraction_to_time' called for Date:Class (NoMethodError) 

I /usr/lib/ruby/1.9.1/date.rb geprüft habe, und ich habe es gefunden:

def day_fraction_to_time(fr) # :nodoc: 
    ss, fr = fr.divmod(SECONDS_IN_DAY) # 4p 
    h, ss = ss.divmod(3600) 
    min, s = ss.divmod(60) 
    return h, min, s, fr * 86400 
end 

Aber ich habe kein Problem, wenn ich es mit ruby1.8 laufen lasse. /usr/lib/ruby/1.8/date.rb gibt mir:

def self.day_fraction_to_time(fr) 
    ss, fr = fr.divmod(SECONDS_IN_DAY) # 4p 
    h, ss = ss.divmod(3600) 
    min, s = ss.divmod(60) 
    return h, min, s, fr 
    end 

Also ging ich die documentation(1.9) und es gibt keine Spur von dieser Methode zu sehen. Ich weiß, es ist eine dumme Frage, aber warum haben sie es entfernt? Es gibt auch dieses Beispiel, wie die Methode zu verwenden, in /usr/lib/ruby/1.9.1/date.rb:

def secs_to_new_year(now = DateTime::now()) 
    new_year = DateTime.new(now.year + 1, 1, 1) 
    dif = new_year - now 
    hours, mins, secs, ignore_fractions = Date::day_fraction_to_time(dif) 
    return hours * 60 * 60 + mins * 60 + secs 
end 

aber ich bin noch immer die Fehlermeldung:

test.rb:24:in `secs_to_new_year': private method `day_fraction_to_time' called for Date:Class (NoMethodError) 
    from test.rb:28:in `<main>' 

Antwort

3

ich weiß nicht, warum es privat gemacht wurde, aber man kann es immer noch Zugang:

hours,minutes,seconds,frac = Date.send(:day_fraction_to_time, stop-start) 

auf diese Weise kann die OOP Verkapselung mechanizm außer Kraft setzen ... Dies ist keine sehr schöne Sache zu tun, aber es funktioniert.

+0

genau zu lesen . Ich bremse die OOP-Struktur, so nervig. Ist es nicht "__send__"? – dierre

+0

@dierre: senden funktioniert auch ... Ich versuchte es in irb vor dem Posten – apirogov

0

Ich habe eine andere Methode gefunden, die elegantere mir scheint:

start = DateTime.now 
sleep 3 
stop = DateTime.now 

puts "Date.day_fraction_to_time using wrapper" 
class Date 
    class << self 
     def wrap_day_fraction_to_time(day_frac) 
     day_fraction_to_time(day_frac) 
     end 
    end 
end 
hours, minutes, seconds, frac = 
    Date.wrap_day_fraction_to_time(stop - start) 
p hours, minutes, seconds, frac 

Dank Colin Bartlett von ruby-forum.com

Um zu verstehen, wie es funktioniert Ich schlage vor, David Seiler answer

+0

Dies ist in der Tat in gewisser Weise eleganter, aber auf der anderen Seite - Monkey Patching Builttin Klassen ist auch eine Sache, die als "schlechte Praxis" "... – apirogov

+0

Ja, aber jetzt habe ich keine Ideen mehr. Ich meine, ich kann natürlich eine Funktion ex novo schreiben, aber es ärgert mich, dass eine Methode verfügbar ist und ich sie nicht benutzen kann. – dierre

Verwandte Themen