2010-09-16 17 views
7

Ho trovato questo metodo here.Ruby, recupera ore, secondi e ora da 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) 

ho il seguente errore:

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

Ho controllato /usr/lib/ruby/1.9.1/date.rb e ho trovato:

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 

Ma non ho alcun problema se lo eseguo con ruby1.8. /usr/lib/ruby/1.8/date.rb mi da:

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 

così sono andato a vedere il documentation(1.9) e non c'è traccia di questo metodo. So che è una domanda stupida, ma perché l'hanno rimosso? C'è anche questo esempio su come utilizzare il metodo 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 

ma sto ancora ottenere l'errore:

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>' 

risposta

3

non so il motivo per cui è stato fatto privato, ma si può ancora accedervi:

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

In questo modo si modifica la mechanizm OOP incapsulamento ... Questa non è una cosa molto bella da fare, ma è lavori.

+0

Esattamente . Sto rompendo la struttura di OOP, così fastidioso. Non è "__send__'? – dierre

+0

@dierre: invia anche opere ... L'ho provato in irb prima di postare – apirogov

0

ho trovato un altro metodo che sembra più elegante per me:

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 

Grazie a Colin Bartlett da ruby-forum.com

Per capire come funziona vi suggerisco di leggere di David Seiler answer

+0

Questo è più elegante in effetti, in un certo senso, ma d'altra parte - le classi built-in di patch di scimmia è anche una cosa che viene vista come "cattiva pratica" "... – apirogov

+0

sì, ma in questo momento sono a corto di idee. Voglio dire, posso ovviamente scrivere una funzione ex novo, ma mi infastidisce che un metodo è disponibile e non posso usarlo. – dierre

Problemi correlati