gpt4 book ai didi

f# 模式与类型匹配

转载 作者:行者123 更新时间:2023-12-04 00:33:17 27 4
gpt4 key购买 nike

我正在尝试递归打印出所有对象属性和子类型属性等。我的对象模型如下...

type suggestedFooWidget = {
value: float ;
hasIncreasedSinceLastPeriod: bool ;
}

type firmIdentifier = {
firmId: int ;
firmName: string ;
}
type authorIdentifier = {
authorId: int ;
authorName: string ;
firm: firmIdentifier ;
}

type denormalizedSuggestedFooWidgets = {
id: int ;
ticker: string ;
direction: string ;
author: authorIdentifier ;
totalAbsoluteWidget: suggestedFooWidget ;
totalSectorWidget: suggestedFooWidget ;
totalExchangeWidget: suggestedFooWidget ;
todaysAbsoluteWidget: suggestedFooWidget ;
msdAbsoluteWidget: suggestedFooWidget ;
msdSectorWidget: suggestedFooWidget ;
msdExchangeWidget: suggestedFooWidget ;
}

我的递归基于以下模式匹配......
let rec printObj (o : obj) (sb : StringBuilder) (depth : int) 
let props = o.GetType().GetProperties()
let enumer = props.GetEnumerator()
while enumer.MoveNext() do
let currObj = (enumer.Current : obj)
ignore <|
match currObj with
| :? string as s -> sb.Append(s.ToString())
| :? bool as c -> sb.Append(c.ToString())
| :? int as i -> sb.Append(i.ToString())
| :? float as i -> sb.Append(i.ToString())
| _ -> printObj currObj sb (depth + 1)
sb

在调试器中,我看到 currObj 的类型是字符串、整数、浮点数等,但它总是跳转到底部的默认情况。知道为什么会这样吗?

最佳答案

正如其他人指出的那样,您需要调用 GetValue成员获取属性的值 - 您实现的迭代迭代 PropertyInfo对象,它们是“属性的描述符” - 不是实际值。但是,我不太明白你为什么使用 GetEnumeratorwhile当可以使用 for 编写相同的内容时显式循环环形。

此外,您不需要忽略 sb.Append 返回的值。调用 - 您可以简单地将其作为整体结果返回(因为它是 StringBuilder )。这实际上会使代码更高效(因为它启用尾调用优化)。最后一点,您不需要 ToStringsb.Append(..) ,因为 Append方法被重载并适用于所有标准类型。

所以经过一些简化,你可以得到这样的东西(它并没有真正使用 depth 参数,但我想你以后想用它来做某事):

let rec printObj (o : obj) (sb : StringBuilder) (depth : int) =
let props = o.GetType().GetProperties()
for propInfo in props do
let propValue = propInfo.GetValue(o, null)
match propValue with
| :? string as s -> sb.Append(s)
| :? bool as c -> sb.Append(c)
| :? int as i -> sb.Append(i)
| :? float as i -> sb.Append(i)
| _ -> printObj currObj sb (depth + 1)

关于f# 模式与类型匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2992139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com