F#混淆输出

F#混淆输出,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() 我预计文本输

我是个初学者。我运行了以下代码:

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()
我预计文本输出将按以下顺序进行:

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

还是这个

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

但我有这个

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


这些函数似乎不符合代码执行顺序。为什么,我遗漏了什么吗?

输出与预期一致

1) 重要信息->打印fn“%s”消息(第3行)

然后定义函数,而不是调用它

2) 重要信息->打印fn“%s”消息(第7行)

现在,你叫它

3) 非常重要->printfn“%s”消息(函数innerMsgChange中的第6行)


4) 重要->printfn“%s”msg(第9行)

首先需要指出的是,
innerMsgChange
并没有实现其名称所承诺的功能:它创建了一个名为
msg
的新变量(该变量与外部变量(也称为
msg
)并具有“非常重要”的值然后打印出来。所以本质上,它打印字符串“非常重要”,就是这样

那么代码的执行顺序是什么呢?简单:

  • 变量
    msg
    设置为“重要”
  • 该变量已打印
  • 定义了
    innerMsgChange
    函数,但未调用该函数(这不是实际执行的步骤,因此此行基本上没有发生任何事情)
  • 再次打印变量
    msg
  • 调用
    innerMsgChange()

    5.1。内部变量
    msg
    设置为“非常重要”。让我们将其称为
    innerMsg
    以消除干扰

    5.2<已打印代码>innerMsg

  • msg
    (仍然具有值“Important”,因为它与
    innerMsg
    )完全无关)再次打印


  • 函数在调用之前不会执行。您有两个名为
    msg
    ——一个隐藏另一个的变量。您可能会发现这个问题有助于了解: