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<已打印代码>innerMsgmsg
(仍然具有值“Important”,因为它与innerMsg
)完全无关)再次打印函数在调用之前不会执行。您有两个名为
msg
——一个隐藏另一个的变量。您可能会发现这个问题有助于了解: