类型成员中的属性和let语句

Mar*_*tts 2 f#

我正在使用FsUnit在F#中编写一些单元测试,我注意到属性周围有一些奇怪的行为,并且在类型成员中使用语句,并且想知道是否有人可以解释它?

如果我写这样的测试:

[<Fact>] member test.
  ``Test that something works correctly`` () =

    let x = 1

    x + 2 |> should equal 3
Run Code Online (Sandbox Code Playgroud)

我将在'x + 2'行的第一个字符的Visual Studio 2012中出错:

表达式中出现意外的关键字"let"或"use".预期'in'或其他标记.

使用'let ... in'可以解决此错误,但如果您想使用多个错误,请让它快速变得混乱:

[<Fact>] member test.
  ``Test that something works correctly`` () =
    let x = 1
    in x + 2 |> should equal 3
Run Code Online (Sandbox Code Playgroud)

我最终发现将属性放在一个单独的行上也可以解决错误:

[<Fact>]
member test.
  ``Test that something works correctly`` () =

    let x = 1

    x + 2 |> should equal 3
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供任何有关第一个代码段导致错误但其他两个不导致错误的信息吗?

pad*_*pad 5

在第一个片段中,您实际上有两个缩进错误.第一个问题是''Test that something works correctly''应该在member关键字后缩进.第二个是函数体应该在所有成员定义行之后缩进.

如果您修复了第一个错误:

[<Fact>] member test.
           ``Test that something works correctly`` () =
    let x = 1
    x + 2 |> should equal 3
Run Code Online (Sandbox Code Playgroud)

编译器将发出"可能不正确的缩进"警告,您可以通过进一步缩进函数体来修复:

[<Fact>] member test.
           ``Test that something works correctly`` () =
             let x = 1
             x + 2 |> should equal 3
Run Code Online (Sandbox Code Playgroud)

在第二个片段中,使用in关键字会触发详细的语法,其中缩进不再重要.在最后一个例子中,member恰好有最低的缩进; 你偶然有正确的缩进.

也就是说,你应该避免将成员定义分成多行.在大多数情况下,您可以使用let绑定而不是更详细的member绑定.

[<Fact>]
let ``Test that something works correctly``() =
    let x = 1
    x + 2 |> should equal 3
Run Code Online (Sandbox Code Playgroud)

  • 或者,`让[<Attribute>] name = ...` (4认同)