Переменная F # вне контекста - PullRequest
3 голосов
/ 19 мая 2011

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

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

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

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

1 Ответ

2 голосов
/ 19 мая 2011

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

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

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

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

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