4 votes

F# : sortie confuse

Je suis un débutant en F#. J'ai exécuté ce code :

let printMsg() =
    let msg = "Important"
    printfn "%s" msg
    let innerMsgChange() =
        let msg = "Very Important"
        printfn "%s" msg
    printfn "%s" msg
    innerMsgChange()
    printfn "%s" msg

printMsg()

Je m'attendais à ce que la sortie du texte se fasse dans cet ordre :

Important, Très important, Important, Important

ou ceci

Important, très important, très important, important

mais j'ai obtenu ceci

Important, Important, Très important, Important

il semble que ces fonctions ne respectent pas l'ordre d'exécution du code. Pourquoi, est-ce que je rate quelque chose ?

8voto

sepp2k Points 157757

Tout d'abord, il est important de souligner que innerMsgChange ne fait pas ce que son nom promet : Il crée une nouvelle variable appelée msg (qui n'a rien à voir avec la variable extérieure qui est également appelée msg ) avec la valeur "Very Important", puis l'imprime. Donc, en substance, il imprime la chaîne "Very Important" et c'est tout.

Dans quel ordre le code est-il exécuté ? C'est simple :

  1. La variable msg est réglé sur "Important".

  2. Cette variable est imprimée.

  3. En innerMsgChange la fonction est définie, mais n'est pas appelée (ce n'est pas une étape qui est exécutée en tant que telle, donc fondamentalement rien ne se passe sur cette ou ces lignes))

  4. La variable msg est à nouveau imprimé

  5. innerMsgChange() s'appelle

    5.1. La variable interne msg est réglé sur "Très important". Nous l'appellerons innerMsg à désamorcer.

    5.2. innerMsg est imprimé.

  6. msg (qui a toujours la valeur "Important" parce qu'il n'est pas du tout lié à innerMsg ) est à nouveau imprimé.

1voto

manojlds Points 96599

Le résultat est conforme aux attentes

1) Important -> printfn "%s" msg ( ligne 3)

alors vous définissez la fonction, et non pas vous l'appelez.

2) Important -> printfn "%s" msg ( ligne 7)

Maintenant, tu l'appelles.

3) Très important -> printfn "%s" msg (ligne 6 dans la fonction innerMsgChange)

4) Important -> printfn "%s" msg ( ligne 9)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X