2
votes

Comment instancier des classes et leurs propriétés en F #

Suivez le code C #:

let body = CustomerRequest
(
    Method = "CREDIT_CARD"     // Help here
)

Je suis nouveau en F #, je ne peux pas instancier des classes comme C #, voir le code ci-dessous en F #:

var body = new CustomerRequest
{
    Method = "CREDIT_CARD",
    CreditCard = new Creditcard
    {
        ExpirationMonth = "06",
        ExpirationYear = "2022",
        Number = "4012001037141112",
        Cvc = "123"
    }
};


0 commentaires

3 Réponses :


3
votes

Si vous faites du F # idiomatique, modélisez cela avec Records au lieu de classes .

Vous pouvez le faire comme ceci:

type CreditCard2(expirationMonth:int) = 
    member this.ExpirationMonth = expirationMonth

type CustomerRequest2(method: string, creditCard: CreditCard2) = 
    member this.Method = method
    member this.CreditCard = creditCard

let req2 = CustomerRequest2 ("Credit", CreditCard2 (5))

Le compilateur a une inférence de type qui signifie qu'il peut deviner que req est une CustomerRequest par les champs que vous avez dedans, et la même chose pour la CreditCard - vous pouvez indiquer le type si vous en avez vraiment besoin.

Si vous êtes vraiment après les classes - peut-être que vous devez interopérer avec du code C #, alors vous le feriez comme ceci:

type CreditCard = {
    ExpirationMonth: int;
    //More
}

type CustomerRequest = {
    Method: string;
    CreditCard: CreditCard;
}

let req = {
    Method = "Credit"
    CreditCard = {
        ExpirationMonth = 6
        //More
    }
}


1 commentaires

Merci de votre aide



2
votes

Je pense que c'est ce que vous recherchez:

CreditCard.fs

open System
open StackOverflow

[<EntryPoint>]
let main argv =
    let body = new CustomerRequest(Method = "CREDIT_CARD",
                                        CreditCard = CreditCard(
                                            ExpirationDate = "06",
                                            ExpirationYear = "2022",
                                            Number = "4012001037141112",
                                            Cvc = "123"
                                        ))
    0

Program.fs

namespace StackOverflow

type CreditCard() =
    member val ExpirationDate = "" with get, set
    member val ExpirationYear = "" with get, set
    member val Number = "" with get, set
    member val Cvc = "" with get, set

type CustomerRequest() =
    member val Method = "" with get, set
    member val CreditCard = new CreditCard() with get, set

Je ne connais pas grand-chose à F #, alors peut-être que l'utilisation de Records comme David Shaw est préférable en termes de conception. Mais fondamentalement, cela vous permettra de le faire sans constructeur de paramètre et sans valeur de propriété non mutable dans votre type.


3 commentaires

Merci de votre aide


En regardant votre code: CreditCard = new CreditCard , vous avez besoin de la commande new ?


@MatheusMiranda Il semble que ce ne soit pas le cas. Je modifierai la réponse.



2
votes

Si vous souhaitez simplement utiliser arguments nommés pour définir les propriétés des classes que vous construisez: la syntaxe est assez similaire à C #. Quant au niveau d'indentation, vous devez vous aligner sur celui du premier argument.

let body =
    CustomerRequest(
        Method = "CREDIT_CARD",
        CreditCard =
            Creditcard(
                ExpirationMonth = "06",
                ExpirationYear = "2022",
                Number = "4012001037141112",
                Cvc = "123" ) )


0 commentaires