F #의 레코드 유형을 사용하면 다음과 같은 구문을 사용하여 다른 레코드를 기반으로 레코드를 초기화 할 수 있습니다.
let rr3 = { defaultRecord1 with field2 = 42 }
비 레코드 유형에도 비슷하게 간결하고 우아한 것이 있습니까?
나는 C # 클래스로 작업하고 있으며 해당 Clone()
메서드를 호출하고 <-
연산자를 사용하여 속성에 할당을 수행하는 중 입니다. 객체 표현식 에 대한이 기사도 찾았 지만 제가 찾던 것이 아닌 것 같습니다.
편집 : 그래서 요약하면 내 F # 코드에서 C # 클래스를 인스턴스화하려고하는데 F #의 레코드와 마찬가지로 다른 개체의 값을 기반으로 클래스의 개체를 생성하는 간결한 구문이 있는지 궁금합니다. with
예어.
실제로 메서드 호출에서 설정 가능한 속성을 이름이 지정된 인수 인 것처럼 사용할 수 있습니다. 따라서 클래스가 Clone
원래 유형을 반환 하는 전용 메서드 로 구현 된 경우 :
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)
그러나 대부분의 경우 클래스에는 ICloneable
구현 만 있습니다 . 이 경우 위의 트릭은 설정 가능한 속성 이없는 ICloneable.Clone
반환 때문에 즉시 작동 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!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다