【问题标题】:Define concise F# class with post constructor logic使用构造函数后逻辑定义简洁的 F# 类
【发布时间】:2011-01-18 22:13:03
【问题描述】:

对于这个类的定义:

type Foo(f1: int, f2: string) =
member x.F1 = f1
member x.F2 = PostProcess f2

每次访问 f2 时都会调用 PostProcess(一些字符串操作函数)吗?如果答案是肯定的并且我想避免它,那么正确的成语是什么?下面这个推荐吗?这对我来说有点太冗长了。

type Foo =
val F1: int
val F2: string

new (f1, f2) as this = 
    {F1 = f1; F2 = f2;}
    then this.F2 = PostProcess(f2) |> ignore

【问题讨论】:

标签: f# idioms


【解决方案1】:

在您的原始定义中,F2 是只读属性,每次访问时都会调用 PostProcess 函数。这很容易验证:

let PostProcess s = printfn "%s" s; s

type Foo(f1: int, f2: string) =
  member x.F1 = f1
  member x.F2 = PostProcess f2

let f = Foo(1,"test")
let s1 = f.F2
let s2 = f.F2

这是我如何编写只处理一次的类:

type Foo(f1: int, f2: string) =
  let pf2 = PostProcess f2
  member x.F1 = f1
  member x.F2 = pf2

【讨论】:

  • 完美!我也验证了自己。而且您的提案看起来又好又简洁。
【解决方案2】:

是的,每次都会重新评估属性(例如,就像 C# 中的 get 属性)。

请参阅@kvb 的回答以获得对您特定问题的简洁回答。

一般来说,参见例如

http://msdn.microsoft.com/en-us/library/dd233192(VS.100).aspx

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!894.entry

有关编写类构造函数的最佳方法的语言信息。简明扼要的总结是,您应该使用“主构造函数”(正如您所拥有的,紧跟在类型名称后面的括号,采用构造函数参数),然后在类的顶部使用 letdo 作为构造函数身体。

【讨论】:

  • 感谢布赖恩的指点。我刚刚开始使用 F# 的 OOP 方面。
猜你喜欢
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多