#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
(что дает вам ссылку на объект замыкания), но это может зависеть от некоторых внутренних компонентов компилятора.