我想知道在F#中是否有一种方法可以简单地克隆一个类实例,并仅更改其中一个或几个属性。
我知道对于记录类型,这是可能的:
let p2 = {p1 with Y = 0.0}
我想知道在F#中是否有一种方法可以简单地克隆一个类实例,并仅更改其中一个或几个属性。
我知道对于记录类型,这是可能的:
let p2 = {p1 with Y = 0.0}
模拟类的复制和更新表达式的一种方法是使用带有可选参数的复制构造函数。
type Person(first, last, age) =
new (prototype: Person, ?first, ?last, ?age) =
Person(defaultArg first prototype.First,
defaultArg last prototype.Last,
defaultArg age prototype.Age)
member val First = first
member val Last = last
member val Age = age
let john = Person("John", "Doe", 45)
let jane = Person(john, first="Jane")
编辑
虽然你并没有要求这个,但在很多情况下,将类设为可变的会导致更清晰的代码:
type Person(first, last, age) =
member val First = first with get, set
member val Last = last with get, set
member val Age = age with get, set
member this.Clone() = this.MemberwiseClone() :?> Person
let john = Person("John", "Doe", 45)
let jane = john.Clone() in jane.First <- "Jane"
type PersonState = { FirstName : string; LastName : string; }
type Person private (state : PersonState) =
new (firstName, lastName) =
Person({ FirstName = firstName; LastName = lastName })
member this.WithFirstName value =
Person { state with FirstName = value }
member this.WithLastName value =
Person { state with LastName = value }
member this.FirstName with get () = state.FirstName
member this.LastName with get () = state.LastName
用途
let JohnDoe = Person("John", "Doe")
let JaneDoe = JohnDoe.WithFirstName "Jane"
let JaneLastName = JaneDoe.LastName