【问题标题】:Attributes and let statements in type members类型成员中的属性和 let 语句
【发布时间】:2013-05-10 14:21:13
【问题描述】:

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

如果我这样写一个测试:

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

    let x = 1

    x + 2 |> should equal 3

在 Visual Studio 2012 中,'x + 2' 行的第一个字符会出现错误:

表达式中出现意外的关键字“让”或“使用”。预期为“in”或其他标记。

使用 'let ... in' 可以避免这个错误,但如果你想使用多个,让它很快变得混乱:

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

我最终发现,将属性放在单独的行上也可以绕过错误:

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

    let x = 1

    x + 2 |> should equal 3

谁能提供任何关于为什么第一个代码 sn-p 会导致错误而其他两个不会导致错误的见解?

【问题讨论】:

  • 看起来是缩进问题。

标签: f#


【解决方案1】:

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

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

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

编译器将发出“可能不正确的缩进”警告,您可以通过进一步缩进函数体来解决此问题:

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

在第二个 sn-p 中,使用 in 关键字触发 verbose syntax 缩进不再重要。在最后一个例子中,member 恰好有最低的缩进;顺便说一句,你有正确的缩进。

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

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

【讨论】:

  • 或者,let [&lt;Attribute&gt;] name = ...
  • @pad 对多行成员的缩进很感兴趣;如果我将名称保留在下一行,但在成员关键字之外缩进它就可以了。
  • @RamonSnir 我不知道你可以在 let 之后应用属性,非常方便。
【解决方案2】:

如 cmets 中所述,您可以将属性放在letmember 之后。这样,您可以将注释和成员定义放在一行中:

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

还有一种情况是您实际上需要使用这种语法。如果您有多个相互递归的函数(可能相互调用),那么您需要使用let rec ... and 定义它们,在这种情况下,您必须将属性放在and 之后:

let rec [<Test>] a () = 10
and [<Test>] b () = 10

但以下语法无效:

[<Test>] 
let rec a () = 10
[<Test>] 
and b () = 10

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2014-02-25
    • 2019-08-11
    相关资源
    最近更新 更多