2011-05-18 3 views
3

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

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

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

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

+1

(Я думаю, что краткий комментарий состоит в том, что у нас все еще есть много мелких ошибок в отношении того, что появляется в окне локаторов отладчика, когда.) – Brian

+0

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

+0

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

ответ

2

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

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

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

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

Смежные вопросы