F# 有一些不错的简洁参数检查函数,可以像这样使用:
let foo (bar : string) : string =
if bar = null then
nullArg "bar"
...
然而,我更喜欢更规范的表达方式,如代码契约(Contract):
let foo (bar : string) : string =
Contract.Requires (bar <> null, "bar is null")
...
然而,我梦想编写的代码是这样的:
let nonNull (expr : Expr) : unit =
// quotation magic
let foo (bar : string) : string =
nonNull <@ bar @>
...
问题是:这可以用F#来表达吗?或者换句话说,F# 中是否有 nonNull 的有效实现?
对我来说它看起来不像,但也许这里有人可以验证它。
最佳答案
正如@svick 在评论中提到的,这目前不会很好地工作,因为 <@ bar @>
实际上将表示为 Value(null, typeof<string>)
.因此,您可以检查该值是否为 null
,但您目前无法获得参数的名称。
您可以执行的部分如下所示:
open Microsoft.FSharp.Quotations
let nonNull (expr : Expr) =
match expr with
| Patterns.Value(null, _) -> failwith "it is null"
| _ -> ()
但是,这可能会在下一个版本中改进:-) 这个 F# feature request需要能够在引用中表示变量的名称。所以也许检查下一个版本的 F#!
关于F# 参数检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725358/