1

J'ai eu peu de discussions sur des langages de programmation modernes comme Scala (et quelques autres langues dont je ne me souviens pas encore) et j'ai souvent ressenti de l'excitation quand les interlocuteurs parlaient: "si une expression dans notre langage de programmation , il renvoie la valeur, WOW ". Donc la question est, pourquoi un if étant une expression plutôt qu'une déclaration comme dans C est mieux?Pourquoi "if as expression not statement" est-il cool?

+1

Vous voulez dire comme ça? 'foo = x == 1? x: y; ' –

+0

Parce qu'il renvoie une valeur, de sorte que vous pouvez faire quelque chose (ou plutôt: rien) avec elle? – Bergi

+0

Voici pourquoi ce n'est pas cool: http://stackoverflow.com/q/4038741/1296806 –

Répondre

3

Il s'agit de traiter valeurs au lieu de traiter (ré) affectations. Les valeurs sont simples et les (ré) affectations sont difficiles; Tenir compte java où si la construction est une déclaration, et aussi blocs {} sont également genre de déclarations, et essayer est également genre de déclaration, et aucun d'eux pourrait retourner la valeur:

Object someObject = null; // you'll have to scan through all 
// of the scope below to find out where `someObject` got assigned from 

try { 
    // ... and now imagine this if statements nested with try statements like 
    // 20 times, and it's hard to refactor them into multiple mehtods, 
    // because they are not logically connected 

    if (someCondition) { 
    someObject = <someValue>; 
    } else { 
    someObject = <anotherValue>; 
    } 
} catch (Exception e) { ....}; 

comparer avec scala, où toutes ces déclarations sont en fait des expressions et peut renvoyer des valeurs:

val someObject = try { 
    if (someCondition) { 
     "someResult" 
    } else { 
    { "something else" } 
    } 
} catch { case Exception e => "someDefaultValue"; } 

maintenant, je soutiens que la version scala est nettement plus simple pour comprendre))) someObject est valeur donc il a été affecté une fois, et je ne suis pas dérangé que quelque part ci-dessous il a été réaffecté. Je n'ai pas besoin de déplacer les variables en dehors des blocs if et try juste pour les garder visibles à l'extérieur. Et si j'ai beaucoup de blocs imbriqués, je peux toujours déduire quelle valeur de résultat sera à chaque niveau juste en la regardant, alors qu'en Java j'ai besoin de garder la méthode entière, et en fait l'exécuter dans ma tête pour pouvoir déduire quelles variables de niveau supérieur ont été mises à jour et quand. BTW java a ?: operator mais il est très limité par rapport à l'expression si de scala (principalement parce que vous ne pouvez pas utiliser les brakets à l'intérieur).

1

Cela peut être surprenant pour certains, mais il y a des langages qui n'ont aucune "instruction". Un exemple serait Haskell. Dans de telles circonstances, il n'y a pas d'autre choix que d'avoir des expressions if.

Notez que tout langage impératif décent a aussi des expressions if. Il est juste appelé et écrit différemment, comme, par exemple:

cond ? "yes" : "no" 

Soit dit en passant, les langages impératifs court-circuit une telle expression, qui est l'argot pour évaluation paresseuse de la 2e et 3e expression (comme Haskell fait de toute façon).