gpt4 book ai didi

f# - 我可以在 StructuredFormatDisplayAttribute 中使用多个属性吗?

转载 作者:行者123 更新时间:2023-12-02 09:40:43 24 4
gpt4 key购买 nike

我正在玩 StructuredFormatDisplay 我假设我可以使用 Value 的多个属性,但似乎事实并非如此。这个question (和接受的答案)一般谈论定制,但给出的示例仅使用单个属性。 MSDN 对于此属性的使用没有帮助。

这是我的例子:

[<StructuredFormatDisplay("My name is {First} {Last}")>]
type Person = {First:string; Last:string}

如果我然后尝试这个:

let johnDoe = {First="John"; Last="Doe"}

我最终遇到了这个错误:

<StructuredFormatDisplay exception: Method 'FSI_0038+Person.First}
{Last' not found.>

该错误似乎暗示它只捕获我的 Value 中提到的第一个属性但我很难有信心地说出这一点。

我发现我可以通过像这样声明我的类型来解决这个问题:

[<StructuredFormatDisplay("My name is {Combined}")>]
type Person = {First:string; Last:string} with
member this.Combined = this.First + " " + this.Last

但我想知道是否有人可以解释为什么我不能使用多个属性,或者如果可以的话,我缺少什么语法。

我在 source 中进行了一些挖掘并发现了这条评论:

In this version of F# the only valid values are of the form PreText {PropertyName} PostText

但我找不到该限制实际实现的位置,因此也许更熟悉代码库的人可以简单地指出我实现该限制的位置,并且我会承认失败。

最佳答案

F# 存储库中的相关代码位于文件 sformat.fs, around line 868 中。省略大量细节和一些错误处理,它看起来像这样:

let p1 = txt.IndexOf ("{", StringComparison.Ordinal) 
let p2 = txt.LastIndexOf ("}", StringComparison.Ordinal)
if p1 < 0 || p2 < 0 || p1+1 >= p2 then
None
else
let preText = if p1 <= 0 then "" else txt.[0..p1-1]
let postText = if p2+1 >= txt.Length then "" else txt.[p2+1..]
let prop = txt.[p1+1..p2-1]
match catchExn (fun () -> getProperty x prop) with
| Choice2Of2 e ->
Some (wordL ("<StructuredFormatDisplay exception: " + e.Message + ">"))
| Choice1Of2 alternativeObj ->
let alternativeObjL =
match alternativeObj with
| :? string as s -> sepL s
| _ -> sameObjL (depthLim-1) Precedence.BracketIfTuple alternativeObj
countNodes 0 // 0 means we do not count the preText and postText
Some (leftL preText ^^ alternativeObjL ^^ rightL postText)

因此,您可以轻松地看到它会查找第一个 { 和最后一个 },然后选择它们之间的文本。因此,对于 foo {A} {B} bar,它会提取文本 A} {B

这听起来确实是一个愚蠢的限制,而且也不难改进。因此,请随时在 F# GitHub page 上提出问题。并考虑发送拉取请求!

关于f# - 我可以在 StructuredFormatDisplayAttribute 中使用多个属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28505368/

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