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

rob*_*kuz 1 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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ann 6

你为什么不这样写测试呢?

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

    let expected = Success(1, 2)
    equals expected actual
Run Code Online (Sandbox Code Playgroud)

这不会产生任何您需要抑制的警告.


Gus*_*Gus 5

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

#nowarn "0025"
Run Code Online (Sandbox Code Playgroud)

我之前也使用过这个快速测试,很可能是你描述的场景.

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

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

然后编译器会很高兴,如果你知道它永远不会到达那里你不会进一步处理那个错误,因为你知道它永远不会被抛出.