初始化 class 实例类似于 F# 中的记录
Initializing class instance similar to records in F#
对于 F# 中的记录类型,您可以使用类似这样的语法来初始化基于另一个记录的记录:
let rr3 = { defaultRecord1 with field2 = 42 }
对于非记录类型,是否也有类似简洁优雅的东西?
我正在使用 C# classes 并调用它们的 Clone()
方法并使用 <-
运算符对其属性进行赋值似乎有点不对劲。我还找到了这篇关于 object expressions 的文章,但它似乎不是我要找的东西。
编辑:总而言之,我正在尝试在我的 F# 代码中实例化 C# classes,我想知道是否有一些简洁的语法来创建 [=24= 的对象] 基于另一个对象的值,就像 F# 中使用 with
关键字的记录一样。
您实际上可以在方法调用中使用可设置的属性,就好像它们是命名参数一样。因此,如果您的 class 是使用专用的 Clone
方法实现的,那么 returns 原始类型:
type Foo() =
member val X = 0 with get, set
member val Y = 0 with get, set
member this.Clone() = new Foo(X = this.X, Y = this.Y)
interface System.ICloneable with
member this.Clone() = box (this.Clone())
那么您将能够执行以下操作:
let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3)
但您的 class 很可能只有 ICloneable
实现。在这种情况下,上述技巧将无法立即使用,因为 ICloneable.Clone
returns obj
没有可设置的 X
属性。幸运的是,您可以添加所需的方法作为扩展:
/// Original class
type Foo() =
member val X = 0 with get, set
member val Y = 0 with get, set
interface System.ICloneable with
member this.Clone() = box (new Foo(X = this.X, Y = this.Y))
let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3) // error FS0039: The field, constructor or member 'Clone' is not defined
let foo3 = (foo1 :> System.ICloneable).Clone(X = 3) // error FS0495: The member or object constructor 'Clone' has no argument or settable return property 'X'. The required signature is System.ICloneable.Clone() : obj.
/// Extension that makes the above trick work
type Foo with
member this.Clone() = (this :> System.ICloneable).Clone() :?> Foo
let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3) // works!
对于 F# 中的记录类型,您可以使用类似这样的语法来初始化基于另一个记录的记录:
let rr3 = { defaultRecord1 with field2 = 42 }
对于非记录类型,是否也有类似简洁优雅的东西?
我正在使用 C# classes 并调用它们的 Clone()
方法并使用 <-
运算符对其属性进行赋值似乎有点不对劲。我还找到了这篇关于 object expressions 的文章,但它似乎不是我要找的东西。
编辑:总而言之,我正在尝试在我的 F# 代码中实例化 C# classes,我想知道是否有一些简洁的语法来创建 [=24= 的对象] 基于另一个对象的值,就像 F# 中使用 with
关键字的记录一样。
您实际上可以在方法调用中使用可设置的属性,就好像它们是命名参数一样。因此,如果您的 class 是使用专用的 Clone
方法实现的,那么 returns 原始类型:
type Foo() =
member val X = 0 with get, set
member val Y = 0 with get, set
member this.Clone() = new Foo(X = this.X, Y = this.Y)
interface System.ICloneable with
member this.Clone() = box (this.Clone())
那么您将能够执行以下操作:
let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3)
但您的 class 很可能只有 ICloneable
实现。在这种情况下,上述技巧将无法立即使用,因为 ICloneable.Clone
returns obj
没有可设置的 X
属性。幸运的是,您可以添加所需的方法作为扩展:
/// Original class
type Foo() =
member val X = 0 with get, set
member val Y = 0 with get, set
interface System.ICloneable with
member this.Clone() = box (new Foo(X = this.X, Y = this.Y))
let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3) // error FS0039: The field, constructor or member 'Clone' is not defined
let foo3 = (foo1 :> System.ICloneable).Clone(X = 3) // error FS0495: The member or object constructor 'Clone' has no argument or settable return property 'X'. The required signature is System.ICloneable.Clone() : obj.
/// Extension that makes the above trick work
type Foo with
member this.Clone() = (this :> System.ICloneable).Clone() :?> Foo
let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3) // works!