Переменная F # вне контекста

#f#

#f#

Вопрос:

В следующем фиктивном коде, если я установлю точку останова в последней строке, переменная x будет недоступна в отладчике с:

имя x не существует в текущем контексте.

 module main = 
    let x = 1
    printfn "%d" x
    1
  

Но если я изменю последнюю строку на 1|>ignore и установлю там точку останова, я смогу увидеть x = 1 в отладчике. Как F определяет, что в первом случае x переменная находится вне области видимости? Спасибо.

Комментарии:

1. (Я думаю, что краткий комментарий заключается в том, что у нас все еще есть много мелких ошибок, касающихся того, что отображается в окне «locals» отладчика, когда.)

2. @Brian — Есть ли какие-либо планы по внедрению поддержки отладчика, специфичного для F #? Я предполагаю, что мало что можно сделать, если F # полагается на поведение C # по умолчанию (хотя я не нахожу это большим делом на практике)

3. У нас нет планов по внедрению нашего собственного EE, но мы все еще могли бы многое сделать для улучшения процесса отладки без EE (например, грубые грани с локальными окнами, интервалы точек останова, асинхронная отладка, …), если найдем время.

4. @Брайан, спасибо. Я просто не могу отличить ошибки от возможностей как новичок.

Ответ №1:

В этом контексте x значение компилируется как статическое поле main модуля (представленное в виде класса).

Я думаю, вы всегда должны быть в состоянии увидеть это в окне просмотра, если вы введете Foo.main.x (где Foo — пространство имен вашего файла — если вы явно не укажете пространство имен, оно будет сгенерировано из имени файла, такого как foo.fs в данном случае).

Почему вы видите переменную, если добавляете ignore ? Я не совсем уверен — вероятно, это потому, что компилятор F # устанавливает точку останова в какое-то место в том же классе, где x находится (в виде поля). Поиск, выполняемый debugger, следует правилам C # (.NET), поэтому он просматривает скомпилированный код, а не исходный код F # (поскольку интеграция с F # не предоставляет собственного распознавателя).

В общем, вы можете предположить, что локальные переменные можно просматривать, если вы находитесь внутри функции, где они объявлены. К захваченным переменным в замыкании обычно можно получить доступ с помощью this (что дает вам ссылку на объект замыкания), но это может зависеть от некоторых внутренних компонентов компилятора.