【问题标题】:F# confusing outputF# 混淆输出
【发布时间】:2011-09-02 20:06:48
【问题描述】:

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

我预计文本输出将按以下顺序:

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

或者这个

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

但我得到了这个

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

这些函数似乎不符合代码执行顺序。为什么会这样,我是不是错过了什么?

【问题讨论】:

  • 你的函数在你调用它之前不会执行。您有两个名为 msg 的变量——一个隐藏另一个。
  • 您可能会发现这个问题有助于查看:stackoverflow.com/questions/2478079/…

标签: f#


【解决方案1】:

首先重要的是要指出innerMsgChange 并没有像它的名字所承诺的那样:它创建了一个名为msg 的新变量(它与也称为msg 的外部变量完全无关)值“非常重要”,然后打印它。所以本质上它会打印字符串“非常重要”,就是这样。

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

  1. 变量msg 设置为“重要”
  2. 打印该变量。
  3. innerMsgChange 函数已定义,但未调用(这不是实际执行的步骤,因此这一行基本上没有任何反应)
  4. 再次打印变量msg
  5. innerMsgChange() 被调用

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

    5.2。 innerMsg 已打印。

  6. msg(仍然具有值“重要”,因为它与 innerMsg 完全无关)再次打印。

【讨论】:

    【解决方案2】:

    输出符合预期

    1) 重要 -> printfn "%s" msg(第 3 行)

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

    2) 重要 -> printfn "%s" msg(第 7 行)

    现在,你叫它。

    3) 非常重要 -> printfn "%s" msg(函数 innerMsgChange 内的第 6 行)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 2020-06-13
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多