Frage

Ich habe diese Methode finden Sie hier: .

  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)

Ich habe überprüft /usr/lib/ruby/1.9.1/date.rb 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. /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 ich die Dokumentation zu sehen, ging (1,9) und es gibt keine Spur von dieser Methode. Ich weiß, es ist eine dumme Frage, aber warum haben sie es entfernen? Es gibt auch dieses Beispiel, wie in der Methode zu verwenden, /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 immer noch den Fehler bekommen:

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>'
War es hilfreich?

Lösung

Ich weiß nicht, warum es privat gemacht wurde, aber man kann es immer noch zugreifen:

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

Auf diese Weise kann die OOP Verkapselung mechanizm außer Kraft setzen ... Das ist nicht eine sehr schöne Sache zu tun, aber es funktioniert.

Andere Tipps

Ich habe eine andere Methode gefunden, die mir elegantere 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 Antwort

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top