使用post构造函数逻辑定义简洁的F#类

vha*_*a14 2 f# idioms

对于此类定义:

type Foo(f1: int, f2: string) =
member x.F1 = f1
member x.F2 = PostProcess f2
Run Code Online (Sandbox Code Playgroud)

每次访问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
Run Code Online (Sandbox Code Playgroud)

kvb*_*kvb 6

在您的原始定义中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
Run Code Online (Sandbox Code Playgroud)

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

type Foo(f1: int, f2: string) =
  let pf2 = PostProcess f2
  member x.F1 = f1
  member x.F2 = pf2
Run Code Online (Sandbox Code Playgroud)