2011-09-02 166 views
4

我是F#初學者。我跑這個代碼:F#混淆輸出

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() 

我預計,文本輸出將是這個順序:

重要,非常重要的,重要,重要的

或本

重要,非常重要,非常重要,重要

,但我得到這個

重要,重要的,非常重要的,重要

似乎這些功能不符合代碼執行順序。爲什麼呢,我錯過了什麼?

+2

在調用它之前,您的函數不會執行。你有兩個名爲'msg'的變量 - 一個隱藏另一個。 – Daniel

+0

你可能會發現這個問題有幫助看看: http://stackoverflow.com/questions/2478079/f-shadowing-and-nested-function – Brian

回答

8

首先其重要的是指出innerMsgChange沒有做它的名字承諾:它創建一個名爲msg的新變量(它與外部變量完全無關,也稱爲msg),其值爲「非常重要」,然後將其打印出來。所以它本質上是打印字符串「非常重要」,就是這樣。

那麼執行代碼的順序是?很簡單:

  1. 變量msg設置爲 「重要」
  2. 該變量打印。
  3. innerMsgChange函數被定義,但不叫(即不是實際上作爲這樣執行的步驟,所以基本上沒有反應在這條線(S))
  4. 可變msg再次印刷
  5. innerMsgChange()叫做

    5.1。內部變量msg設置爲「非常重要」。讓我們把它稱爲innerMsg來消除。

    5.2。打印出innerMsg

  6. msg(仍然具有「重要」值,因爲它與innerMsg完全無關)再次打印。

1

的輸出是如預期

1)重要的 - > printfn 「%S」 MSG(第3行)

則定義該函數,而不是調用它。

2)重要 - > printfn 「%s的」 味精(7號線)

現在,你怎麼稱呼它。

3)非常重要 - > printfn 「%S」 MSG(內部功能innerMsgChange第6行)

4)重要 - > printfn 「%S」 MSG(第9行)