| Documentation language LUA |
Les expressions en LUA |
Les expressions en LUA sont évaluées afin d'exécuter les calculs qui affectent des valeurs aux variables ou pour passer des arguments aux fonctions.
Nous emploierons = la notation racourcie dans ce document.
Les valeurs peuvent facilement être assignées à une variable,
par exemple,
> x = 7
> print(x)
7
> = 7
7
Expressions arithmétiques
Lua utilise les opérateurs habituels d'arithmétique binaire.
> = 2+3, 5-12, 2*7, 7/8
5 -7 14 0.875
> = 5*(2-8.3)/77.7+99.1
98.694594594595
Négation unaire :
> = -(-10), -(10)
10 -10
Puissance de :
> = 7^2, 107^0, 2^8
49 1 256
On fournit des opérateurs apparentés qui
renvoient les valeurs booléennes true ou false.
== égale à
~= pas égale à
< moins que
> plus grand que
<= inférieur ou égal à
>= supérieur ou égal à
Exemples :
> = 1 == 1, 1 == 0
true false
> = 1 ~= 1, 1 ~= 0
false true
> = 2 < 7, 2 > 7
true false
> = 3 <= 7, 7 <= 7, 8 <= 7
true true false
> = 3 >= 7, 7 >= 7, 8 >= 7
false true true
Ceux-ci opérent également sur des chaînes de caractères et d'autres types.
> = "abc" < "def"
true
>
= "abc" > "def"
false
>
= "abc" == "abc"
true
>
= "abc" == "a".."bc"
true
Les objets ne seront pas égaux si les types sont différents ou se rapportent à différents objets.
> = {} == "table"
false
> = {} == {} -- two different tables are created here
false
> t = {}
> t2 = t
> = t == t2 -- we're referencing the same table here
true
La coercition ne fonctionne pas ici, les types doivent être convertie explicitement. Voir Nombres et Chaînes pour l'explication de la coercition.
> = "10" == 10
false
>
= tonumber("10") == 10
true
Lua dispose des opérateurs logiques and, or et not.
En Lua tous nil et valeur booléenne false représentent
false (faux) dans
une expression logique. Quelque chose qui n'est pas faux (l'un
ou l'autre nil ou false) est true (vrai).
Il
y
a plus de notes sur les implications de ceci à la fin de cette page.
> = false==nil -- although they represent the same
thing they are not equivalent
false
> = true==false, true~=false
false true
> = 1==0
false
>
= does_this_exist -- test to see if variable "does_this_exist" exists.
no, false.
nil
not - (n'est pas)
Le mot-clé not inverse une valeur
logique d'expression :
> = true, false, not true, not false
true false false true
> = not nil -- nil represents false
true
> = not not true -- true is not not true!
true
>
= not "foo" -- anything not false or nil is true
false
and - (et)
L'opérateur binaire and ne
renvoie pas nécessairement une valeur
booléenne true ou false à l'expression logique X
et y. Dans certains languages, l'opérateur and retourne une
valeur booléenne
dépendante des deux valeurs entrées. Par contre dans Lua, elle renvoie
le
premier
argument si sa valeur est false ou nil, et le
deuxième argument si le premier argument n'était pas faux.
Ainsi, un booléen est seulement retourné si les valeurs passées
étaient booléen.
> = false and true -- false is returned because it
is the first argument
false
> = nil and true -- as above
nil
> = nil and false
nil
>
= nil and "hello", false and "hello"
nil false
Toutes les expressions ci-dessus renvoient le premier argument. Toutes les expressions suivantes renvoient le deuxième argument, car le premier est vrai.
> = true and false
false
>
= true and true
true
>
= 1 and "hello", "hello" and "there"
hello there
>
= true and nil
nil
Comme vous pouvez voir que les expressions logiques sont encore évaluées correctement mais nous avons un comportement intéressant en raison des valeurs retournées.
or L'opérateur binaire également ne renvoie pas nécessairement
une valeur booléenne (voir les notes pour and ci-dessus). Si le premier argument n'est pas faux
il est retourné, autrement le deuxième argument est retourné.
> = true or false
true
> = true or nil
true
>
= "hello" or "there", 1 or 0
hello 1
Ceci peut être une propriété très utile. Par exemple, plaçant des valeurs par défaut dans une fonction :
> function foo(x)
>>
local value = x or "default" -- if argument x is false or nil, value
becomes "default"
>> print(value, x)
>> end
>
> foo() -- no arguments, so x is nil
default nil
> foo(1)
1 1
> foo(true)
true true
>
foo("hello")
hello hello
Les opérateurs ternaires sont un dispositif utile dans le C. par exemple. int value = x>3 ? 1 : 0;
Ce comportement peut être partiellement émulé dans Lua
en utilisant les opérateurs logiques and et or.
La forme de C :
value = test ? x : y;
traduit en Lua :
value = test and x or y
Par exemple.
> print( 3>1 and 1 or 0 )
1
>
print( 3<1 and 1 or 0 )
0
>
print( 3<1 and "True" or "False" )
False
>
print( 3>1 and true or "false" )
true
Cependant, il y a une limite, ceci
fonctionne seulement quand la première valeur de retour n'est pas nil ou false.
> print( 3>1 and 1 or "False" ) -- works
1
>
print( 3>1 and false or "oops" ) -- failed, should return false
oops
>
print( 3>1 and nil or "oops" ) -- failed, should return nil
oops
Un point important à noter est que la valeur 0 n'est pas une condition
d'essai fausse dans Lua.
Dans d'autre langauge, par exemple C, un test :
if (0)
printf("true");
else
printf("false");
montrerait "false". Dans Lua,
> if 0 then
>>
print("true")
>>
else
>>
print("false")
>>
end
true
affiche true
Vous devriez employer false, ou nil au
lieu de 0 :
> if false then print("true") else print("false")
end
false
>
if nil then print("true") else print("false") end
false
Pourquoi ?
La raison de ceci est historique. Lua n'a pas
soutenu les types booléens (c.-à-d. true et false)
avant la version 5.0. Avant la version 5.0 une valeur nil représentatit
false (faux).
Maintenant, tous les deux nil et false agiront en tant
qu'état faux dans une
expression conditionnelle. Par exemple,
> if nil then print("true") else print("false")
end
false
>
if 1 then print("true") else print("false") end
true
>
if 0 then print("true") else print("false") end
true
>
if 1==2 then print("true") else print("false") end
false
Un autre point à noter est celui true et false ne
sont des valeurs numériques, par
exemple, 1 et 0 comme dans d'autres languages.
> = true, false
true false
> = 1 + true
stdin:1: attempt to perform arithmetic on a boolean value
stack traceback:
stdin:1: in main chunk
[C]: ?
En outre, nil est forcé à une valeur
booléenne une fois utilisé avec un opérateur logique :
> = not nil
true
>
= not 1
false
>
= not 0
false
www.loriotpro.com |
|