【发布时间】:2018-12-23 11:34:45
【问题描述】:
我有几个通用的内联函数,例如:
let inline getRatesImpl<'T when 'T : (member enantiomer : 'T) and 'T : equality>
(d : Dictionary<'T, (ReactionRate option * ReactionRate option)>)
(calculateRates : 'T -> RelatedReactions<'T>)
(r : 'T) =
match d.TryGetValue r with
| true, rates ->
rates
| false, _ ->
updateRelatedReactions d (calculateRates r) r
函数是这样使用的:
type FoodCreationModel (p : FoodCreationParam) =
let rateDictionary = new Dictionary<FoodCreationReaction, (ReactionRate option * ReactionRate option)>()
let calculateRates _ = getRates (Some p.foodCreationRate, Some 1.0) (None, None)
member __.getRates r =
getRatesImpl rateDictionary calculateRates r
member __.inputParams = p
当我在getRatesImpl 中插入一个break 时,它不会在FSI 中被击中。即使我在getRates(在线getRatesImpl rateDictionary calculateRates r)上休息一下,然后按F11,FSI 也不会进入inline getRatesImpl。但是,它确实有效,我可以通过查看字典在调用前后的变化来检查它。
其中一些内联函数非常复杂,我真的需要不时调试它们。
问题是怎么做的?
【问题讨论】:
-
我发现调试中断不适用于内联。你能将内联函数分成两部分吗?需要内联的部分和非内联的部分。内联函数提取所有只能在内联函数中收集的信息,并调用包含复杂逻辑的非内联部分。这样您就可以调试非内联逻辑。除了我认为你需要依赖
printfn。 -
@ Justanothermetaprogrammer 虽然很不幸,但 FSI 无法在内联函数中进行调试可以作为答案。我很乐意将其标记为答案,您将其作为答案而不是评论:)
标签: debugging f# inline f#-interactive