Itérer sur Ruby objet de Temps avec delta
Est-il un moyen pour effectuer une itération sur une plage de Temps en Ruby, et définir le delta?
Voici une idée de ce que je voudrais faire:
for hour in (start_time..end_time, hour)
hour #=> Time object set to hour
end
Vous pouvez parcourir le Temps des objets, mais il revient à chaque seconde entre les deux. Ce que j'ai vraiment besoin d'une manière de définir le décalage de la ou delta (comme la minute, l'heure, etc.)
Est construit dans cette de Rubis, ou est-il décent de plugin disponible?
Vous devez vous connecter pour publier un commentaire.
Avant 1.9, vous pouvez utiliser
Range#step
:Cependant, cette stratégie est assez lent car il ferait appel
Time#succ
3600 fois. Au lieu de cela,comme l'a souligné dolzenko dans sa réponse, une solution plus efficace consiste à utiliser une boucle simple:
Si vous êtes à l'aide de Rails, vous pouvez remplacer 3600 avec
1.hour
, ce qui est nettement plus lisible.Range
'sstep
méthode pourTime
étapes. J'ai écrit une réponse à l'étape dynamique des intervalles comme2.months + 33.seconds
(si vous êtes à l'aide deActiveSupport
). Voir stackoverflow.com/questions/19093487/ruby-create-range-of-dates/.... En interne, la méthode utilise ce tout-boucle approche.Si votre
start_time
etend_time
sont en fait des cas deTime
classe alors la solution avec l'aide de laRange#step
serait extrêmement inefficace, car il permettrait d'effectuer une itération sur chaque seconde dans cette gamme avecTime#succ
. Si vous convertissez votre temps à des entiers le plus simple sera utilisé, mais de cette façon, vous allez vous retrouver avec quelque chose comme:Mais cela peut aussi être fait avec la plus simple et la plus efficace (c'est à dire sans toutes les conversions de type) boucle:
Gamme#étape, la méthode est très lente dans ce cas. L'utilisation de commencer..fin, alors que, comme dolzenko posté ici.
Vous pouvez définir une nouvelle méthode:
puis,
si dans les rails.