IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Cours complet pour apprendre à programmer en D


précédentsommairesuivant

40. Opérateurs paresseux (lazy)

L'évaluation paresseuse consiste à retarder l'exécution d'expressions jusqu'au moment où l'on a besoin du résultat de ces expressions. Les évaluations paresseuses font partie des fonctionnalités fondamentales de certains langages de programmation.

Naturellement, retarder l'exécution d'expressions jusqu'à ce que leur résultat soit vraiment nécessaire peut rendre les programmes plus rapides.

Le comportement raccourci des opérateurs suivants est conceptuellement similaire aux évaluations paresseuses :

  • l'opérateur || (ou) : la seconde expression est évaluée seulement si la première est fausse (false) :

     
    Sélectionnez
    if (uneExpression() || peutNePasÊtreÉvaluée()) {
        // ...
    }
  • Si le résultat de uneExpression() est true, le résultat de l'expression || est aussi vrai et la seconde expression n'est pas évaluée ;

  • l'opérateur && (et) : la seconde expression est évaluée seulement si la première est vraie (true) :

     
    Sélectionnez
    if (uneExpression() && peutNePasÊtreÉvaluée()) {
        // ...
    }
  • Si le résultat de uneExpression est faux (false), le résultat de l'expression && est également faux et la seconde expression n'est pas évaluée ;

  • l'opérateur ternaire ? : soit la première, soit la deuxième expression est évaluée, si la condition est vraie ou fausse, respectivement :
 
Sélectionnez
int i = condition() ? soitCeci() : soitCela();

La paresse de ces opérateurs n'est pas seulement une question de performance. Parfois, évaluer une des expressions peut être une erreur.

Par exemple, ci-après, vérifier la condition « si la première lettre est A » serait une erreur si la chaîne est vide :

 
Sélectionnez
dstring s;
// ...
if (s[0] == 'A') {
    // ...
}

Pour pouvoir accéder à l'élément d'indice zéro de s, il faut d'abord s'assurer que la chaîne contient un tel élément. Pour cette raison, la vérification de condition suivante déplace cette expression logique potentiellement erronée du côté droit de l'opérateur && afin de s'assurer qu'elle ne sera évaluée que lorsqu'effectuer cette évaluation sera sans risque :

 
Sélectionnez
dstring s;
// ...
if ((s.length >= 1) && (s[0] == 'A')) {
    // ...
}

Les évaluations paresseuses peuvent également être effectuées par les pointeurs de fonctions, les déléguées (delegates) et les tranches. Nous verrons cela dans un chapitre ultérieur.


précédentsommairesuivant