F#变量脱离上下文

时间:2011-05-18 20:11:02

标签: f#

在下面的虚拟代码中,如果我在最后一行设置了一个断点,那么在调试器中无法访问变量x

  

当前上下文中不存在名称x。

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

但如果我将最后一行更改为1|>ignore并在那里设置断点,我可以在调试器中看到x = 1。 F在第一种情况下如何确定x超出范围?感谢。

1 个答案:

答案 0 :(得分:2)

在此上下文中,x值被编译为main模块的静态字段(表示为类)。

我认为如果输入Foo.main.x(其中Foo是文件的命名空间),您应该始终能够在监视窗口中看到它 - 如果您没有明确提供命名空间,这将是在这种情况下,从文件名生成,例如foo.fs

如果添加ignore,为什么会看到该变量?我不完全确定 - 可能是因为F#编译器将断点设置到放置x的同一个类中的某个位置(作为字段)。调试器完成的查找遵循C#(.NET)规则,因此它查看已编译的代码而不是F#源代码(因为F#集成不提供自己的解析器)。

通常,如果您在声明它们的函数内部,可以假设可以查看局部变量。通过使用this(它提供对闭包对象的引用),通常可以访问闭包中的捕获变量,但这可能取决于某些编译器内部。