- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在玩 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/
我不认为它可能,但你能做类似的事情来允许通过类型扩展进行自定义格式化吗? [] type Rate with member x.PrettyPrinter = x.Title + string
我正在玩 StructuredFormatDisplay 我假设我可以使用 Value 的多个属性,但似乎事实并非如此。这个question (和接受的答案)一般谈论定制,但给出的示例仅使用单个属性。
我是一名优秀的程序员,十分优秀!