La bonne réponse a déjà identifié la méthode "lazy", mais l'exemple fourni n'était pas trop utile. Je vais donner un meilleur exemple de quand il est approprié d'utiliser lazy avec des tableaux. Comme indiqué, lazy est défini en tant que méthode d'instance du module Enumerable, et il fonctionne sur DES objets qui implémentent le module Enumerable (par exemple les tableaux - [].lazy
) ou des énumérateurs qui sont la valeur de retour des itérateurs dans le module énumerable (par exemple each_slice - [].each_slice(2).lazy
). Notez que dans le module Enumerable, certaines des méthodes d'instance renvoient des valeurs plus primitives comme true ou false, d'autres renvoient des collections comme les tableaux et d'autres renvoient des énumérateurs. Certains renvoient des énumérateurs si aucun bloc n'est donné.
Mais pour notre exemple, la classe IO a également un itérateur each_line, qui renvoie un énumérateur et peut donc être utilisé avec "lazy". La belle chose à propos du renvoi d'un énumérateur est qu'il ne charge pas réellement la collection (par exemple un grand tableau) en mémoire sur lequel il travaille. Au lieu de cela, il a un pointeur vers la collection et stocke ensuite l'algorithme (par exemple each_slice(2)
) qu'il utilisera sur cette collection, lorsque vous souhaitez traiter la collection avec quelque chose comme to_a
, par exemple.
Donc, si vous travaillez avec un énumérateur pour un énorme gain de performance, vous pouvez maintenant attacher lazy à l'énumérateur. Ainsi, au lieu de parcourir toute une collection pour mettre en correspondance cette condition :
file.each_line.select { |line| line.size == 5 }.first(5)
Vous pouvez invoquer lazy:
file.each_line.lazy.select { |line| line.size == 5 }.first(5)
Si nous analysons un grand fichier texte pour les 5 premières correspondances, une fois les 5 correspondances trouvées, il n'est plus nécessaire de poursuivre l'exécution. D'où la puissance de lazy avec n'importe quel type d'objet énumérable.