2010-09-16 10 views
7

Encontré este método here.Ruby, obtenga horas, segundos y hora desde 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) 

tengo el siguiente error:

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

He comprobado /usr/lib/ruby/1.9.1/date.rb y lo he encontrado:

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 

Pero no tengo ningún problema si lo ejecuto con ruby1.8. /usr/lib/ruby/1.8/date.rb me 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 

así que fui a ver el documentation(1.9) y no hay rastro de este método. Sé que es una pregunta tonta, pero ¿por qué la eliminaron? Hay incluso este ejemplo sobre cómo utilizar el método en /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 

pero todavía estoy consiguiendo el error:

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

Respuesta

3

no sé por qué se hizo privada, pero todavía se puede acceder a ella:

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

de esta manera se anula la programación orientada a objetos mechanizm encapsulación ... Esto no es una cosa muy agradable de hacer, pero trabajos.

+0

Exactamente . Estoy rompiendo la estructura OOP, tan molesto. ¿No es '__send__'? – dierre

+0

@dierre: enviar trabajos también ... Lo intenté en irb antes de publicar – apirogov

0

he encontrado otro método que parece más elegante para mí:

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 

Gracias a Colin Bartlett de ruby-forum.com

Para entender cómo funciona Sugiero leer de David Seiler answer

+0

Esto es más elegante, de hecho, de alguna manera, pero por otro lado, las clases integradas de parches de mono también son algo que se considera una "mala práctica" "... – apirogov

+0

sí, pero ahora me he quedado sin ideas. Quiero decir que puedo escribir una función ex novo pero me molesta que un método esté disponible y no pueda usarlo. – dierre

Cuestiones relacionadas