Je ne comprends pas cet idiome Lua

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je débute en Lua, et je me fais une formation accélérée en essayant d’améliorer le support des maths dans SILE.

En lisant du code, j’ai repéré ce genre de choses :

self.height = self.base and self.base.height or 0

Je ne comprends pas le côté droit de l’affectation. J’ai supposé que ça voulait dire « si self.base est défini, alors l’expression vaut self.base.height, sinon elle vaut 0 ».

Le problème, c’est que je ne comprends pas l’idée derrière cette syntaxe, qu’est-ce que les opérateurs and et or viennent faire là alors que l’opération n’a rien à voir avec la logique. Est-ce qu’il s’agit d’une version bizarre de l’opérateur ternaire ?

Merci d’avance.

Si je suis bien la logique, c’est ici pour un triangle en me fixant sur la ligne et n’ayant pas regardé le reste du code.

En gros, si le troisième coté est égale à la hauteur et à la base, ou est égale à 0.

Édité par mrchiantos

Ancien Dev de Uag Cms / Inu, je développe actuellement le jeu BlockColor.

+0 -2

Cette réponse a aidé l’auteur du sujet

Salut,

Pour répondre à la question, en Lua l’évaluation d’une expression logique suit la short-circuit evaluation et en plus retourne un des opérandes plutôt qu’un booléen.

En évaluant a and b, Lua évalue d’abord a, si c’est faux (enfin, si la valeur est considérée comme fausse, donc soit un false soit un nil) on est sûr que a and b sera faux aussi et Lua retourne a. Si a est vrai (donc n’importe quoi sauf false ou nil), le résultat du and sera b.

Pour un a or b, c’est l’inverse, si a est vrai, on est sûr que le or sera vrai aussi et donc on retourne simplement a. Si a est faux, le résultat du or sera b.

Donc une expression a and b or c renvoie c si a est faux (ou bien si a est vrai et b est faux), et renvoie b si a est vrai et b est vrai. Donc c’est effectivement une façon détournée d’écrire un opérateur ternaire.

Édité par adri1

I don’t mind that you think slowly, but I do mind that you are publishing faster. — W. Pauli

+4 -0

C’est une condition ternaire.

Ça dit si self.base est défini, cherche la valeur self.base.height sinon retourne 0. Ça permet de t’éviter de te prendre une erreur avec self.base.height lorsque self.base n’est pas défini (=> n’est pas un objet).

Édité par A-312

+0 -0

L’importance n’est pas forcement le résultat, mais le fait d’avoir voulu aider.

Même si la réponse n’est pas prise en compte ou alors mauvaise, cela n’a pas d’importance.

Édité par mrchiantos

Ancien Dev de Uag Cms / Inu, je développe actuellement le jeu BlockColor.

+0 -0
Auteur du sujet

@A-312 J’apprécie toutes vos réponses, je ne voulais vexer personne, désolé si mon message a pu faire penser que non. J’avais compris ce que fait cette expression ternaire, même si je ne l’ai pas exprimé aussi clairement que toi, et c’est bien le « pourquoi ça marche » que je cherchais à trouver et que adri1 m’a indiqué.

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte