Определить лаконичный класс F# с логикой пост-конструктора

Для этого определения класса:

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

Будет ли PostProcess (некоторая функция обработки строк) вызываться каждый раз при доступе к f2? Если ответ да, и я хочу избежать этого, то какая идиома правильная? Рекомендуется ли это ниже? Это слишком многословно для меня.

type Foo =
val F1: int
val F2: string

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

person vha14    schedule 19.02.2010    source источник
comment
Смутно связанный вопрос, который может заинтересовать любого, кто приземлится здесь: stackoverflow.com/questions/1624571/   -  person Benjol    schedule 22.02.2010


Ответы (2)


В вашем исходном определении 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
person kvb    schedule 19.02.2010
comment
Идеальный! Я также проверил себя. И ваше предложение выглядит хорошо и лаконично. - person vha14; 19.02.2010

Да, свойства каждый раз переоцениваются (например, как свойство get в C#).

См. ответ @kvb для краткого ответа на ваш конкретный вопрос.

В общем, см., например.

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

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

для получения информации о языке о наилучшем способе написания конструкторов классов. Кратко говоря, вы должны использовать «первичный конструктор» (как у вас, круглые скобки сразу после имени типа, которые принимают аргументы конструктора), а затем использовать let и do в верхней части класса в качестве тела конструктора.

person Brian    schedule 19.02.2010
comment
Спасибо Брайан за указатели. Я только начинаю использовать аспекты ООП F#. - person vha14; 19.02.2010