F # запутанный вывод - PullRequest
       2

F # запутанный вывод

4 голосов
/ 03 сентября 2011

Я новичок в 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 ]

8 голосов
/ 03 сентября 2011

Прежде всего важно отметить, что innerMsgChange не выполняет то, что обещает его имя: оно создает новую переменную с именем msg (которая совершенно не связана с внешней переменной, которая также называется msg) с помощью значение «Очень важно», а затем печатает его. По сути, он печатает строку «Очень важно» и все.

Так в каком порядке выполняется код? Простой:

  1. Переменная msg установлена ​​на «Важное»
  2. Эта переменная печатается.
  3. Функция innerMsgChange определена, но не вызывается (это не шаг, который фактически выполняется как таковой, поэтому в этой строке (ях) ничего не происходит)
  4. Переменная msg печатается снова
  5. innerMsgChange() называется

    5,1. Внутренняя переменная msg установлена ​​на «Очень важно». Давайте обратимся к нему как innerMsg для устранения двусмысленности.

    5,2. innerMsg напечатано.

  6. msg (который по-прежнему имеет значение «Важно», поскольку оно совершенно не связано с innerMsg) печатается снова.

1 голос
/ 03 сентября 2011

Вывод соответствует ожидаемому

1) Важно -> printfn "% s" msg (строка 3)

тогда вы определяете функцию, а не вызываете ее.

2) Важно -> msg (print 7) * printfn (строка 7)

Теперь вы называете это.

3) Очень важно -> printfn "% s"msg (строка 6 внутри функции innerMsgChange)

4) Важно -> printfn "% s" msg (строка 9)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...