Exécution une seule fois dans une boucle


#1

Bonjour,

Y-a-t-il une fonction disponible dans Rails comme un filtre unique qui
retourne la valeur de l’élément filtré seulement si c’est la première
fois
qu’elle est rencontrée, qu’on pourrait utiliser lors de boucle par
exemple.

Je vous remercie par avance,

Pierre.


#2

Bonjour,

Heu… C’est le principe des caches ça, non ?

Côme


#3

Côme :

Heu… C’est le principe des caches ça, non ?

Côme

Merci Côme, au début j’avais mal compris la question, je croyais
qu’il parlait pour une collection donnée et je pensais donc à
Enumerable#detect.

Donc pour les caches, je comprends encore mal la question
si c’est pour une valeur donnée (un attribut d’un objet), ou une
famille de valeurs retournée par des appels de méthode.

Dans le premier cas :

def machin
@machin ||= calcul_complexe_pour_obtenir_machin()
end

Dans le second cas, il faut faire ce qu’on appelle en anglais
de la memoization :

Voir et lire : http://media.fngtps.com/rubybanter/2007/004/

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)


#4

Bonjour,

En fait, je pensais à l’analogue du filtre unique qui existe sur SPIP
par exemple.

D’après http://www.spip.net/fr_article901.html :

  • [SPIP 1.8] introduit le filtre unique qui retourne la valeur de
    l’élément filtré seulement si c’est la première fois qu’elle est
    rencontrée. Ce filtre n’est pas limité aux dates mais est intéressant
    pour, par exemple, afficher une liste d’articles par date :
    <BOUCLE_blog(ARTICLES){par date}{inverse}{"
    "}> [

    (#DATE|
    affdate_mois_annee|unique)

    ] #TITRE … </BOUCLE_blog>

cette balise n’affichera la date qu’à chaque changement de mois.

Voici un autre exemple :
<BOUCLE_blog2(ARTICLES){par date}{inverse}> [


(#DATE|annee|
unique)

] [

(#DATE|affdate{‘Y-m’}|unique|nom_mois)

] #TITRE
</BOUCLE_blog2>

affichera une liste ressemblant à :
2005
mars
article de mars
autre article de mars
février
article de février
2004
décembre
un article

Merci :slight_smile:

Pierre