如何在不完整模式匹配时抑制编译器警告

时间:2015-01-17 21:52:24

标签: f# pattern-matching

好的,好的 - 我知道这是一个坏主意。然而,在一个非常具体的背景下 - 在我的测试用例中,我只是期望某个结果,而其他任何东西都会以任何方式出错。并且进行模式匹配只会模糊我的测试代码。

这是一个例子

type Result =
     | Success of int * int
     | Error of String

let someFunc x : Result = // implementation not important here

// and then later in my test code

[<Test>]
member me.``Some Cool Test Method``() =
    let (Success x, y) = someFunc "Foo"
    equals x 1
    equals y 2

关于如何使其更加愉快和编译友好的任何想法?

2 个答案:

答案 0 :(得分:6)

你为什么不这样写测试?

[<Test>]
member me.``Some Cool Test Method``() =
    let actual = someFunc "Foo"

    let expected = Success(1, 2)
    equals expected actual

这不会产生任何您需要压制的警告。

答案 1 :(得分:5)

您可以通过在不完整的模式匹配之前的某处插入此行来禁用警告:

#nowarn "0025"

我之前也使用过它来进行一些快速测试,很可能是你描述的场景。

另一个可能是你通过进行模式匹配引用的选项是使用通配符_捕获所有其他情况并抛出错误:

[<Test>]
member me.``Some Cool Test Method``() =
    match someFunc "Foo" with
    | (Success x, y) ->
        equals x 1
        equals y 2
    | _ -> failwith "unexpected value"

然后编译器会开心,如果你知道它永远不会到达那里,你就不会再进一步​​处理这个错误,因为你知道它永远不会被抛出。