【发布时间】:2016-09-29 11:29:50
【问题描述】:
在寻找答案时,我发现了几个与我的情况不太相符的问题——所以我会问一个新问题。
我正在为一个数据结构编写一些 FsCheck 测试,我想在我构建的数据结构的每个副本上检查大约 20 个不同的属性。到目前为止,我所做的是为每个属性编写一个谓词,然后我制作了一个谓词列表,我会用List.forall 依次调用它们,如下所示:
module PropertyChecks =
let ``Tail length plus tree length should equal vector length`` vec =
treeLength vec.root + Array.length vec.tail = vec.len
let ``The tail may only be empty iff the vector is empty`` vec =
(vec.len = 0) = (Array.length vec.tail = 0)
let ``The tail's length may not exceed tailMax`` vec =
Array.length vec.tail < tailMax
let ``If vec.len <= tailMax, all items are in tail and root is empty`` vec =
(vec.len > tailMax) || (Array.length vec.root = 0)
// And so on for about 15 more predicates
let allProperties =
[
``Tail length plus tree length should equal vector length``
``The tail may only be empty iff the vector is empty``
``The tail's length may not exceed tailMax``
``If vec.len <= tailMax, all items are in tail and root is empty``
]
let checkProperties vec =
allProperties |> List.forall (fun pred -> pred vec)
// Rest of my code omitted since it's not relevant to the question
我面临的问题是,我预计当一个属性因为我没有正确构建数据结构而失败时,另外两个或三个其他属性会同时失败。我想获取所有失败属性的列表,这意味着在checkProperties 中我想提取失败谓词的 name。我已经看到了多个答案,例如“您无法从作为参数收到的任意 F# 函数中获取 MethodInfo,因为您永远不知道您是否获得了函数本身、lambda 或匿名功能”。但在这里,我不仅知道我有真正的功能,我还知道它们的名字。我可以轻松地将它们的名称复制并粘贴到字符串中,并使 allProperties 成为 (string,function) 元组的列表。但是我已经对复制和粘贴一次(将谓词放入该列表)感到不太满意,我宁愿不这样做两次。
制作(函数名称,函数)元组列表的更好解决方案是什么?我可以将allProperties 和checkProperties 移出PropertyChecks 模块,使其只包含谓词,然后使用反射来遍历该模块吗?
我对整个 .Net 反射系统非常陌生,所以我很可能会遗漏一些明显的东西。如果我错过了,请随时指出显而易见的;我不会感到被侮辱。
【问题讨论】:
-
在没有带有反射的棘手解决方案的情况下,使用所需级别的 shell 脚本解析此文件不会太难
-
看了标题,只能想到:lambda, lambda, lambda.
标签: reflection f#