Existe-t-il un moyen plus rapide / plus court d’initialiser les variables dans une structure Rust?

Dans l’exemple suivant, je préférerais beaucoup atsortingbuer une valeur à chaque champ de la structure dans la déclaration des champs. Alternativement, il faut effectivement une déclaration supplémentaire pour chaque champ pour atsortingbuer une valeur aux champs. Tout ce que je veux pouvoir faire est d’atsortingbuer des valeurs par défaut lorsque la structure est instanciée.

Y a-t-il une manière plus succincte de le faire?

struct cParams { iInsertMax: i64, iUpdateMax: i64, iDeleteMax: i64, iInstanceMax: i64, tFirstInstance: bool, tCreateTables: bool, tContinue: bool, } impl cParams { fn new() -> cParams { cParams { iInsertMax: -1, iUpdateMax: -1, iDeleteMax: -1, iInstanceMax: -1, tFirstInstance: false, tCreateTables: false, tContinue: false, } } } 

Vous pouvez fournir des valeurs par défaut pour votre struct en implémentant le trait Default . La fonction default ressemblerait à votre new fonction actuelle:

 impl Default for cParams { fn default() -> cParams { cParams { iInsertMax: -1, iUpdateMax: -1, iDeleteMax: -1, iInstanceMax: -1, tFirstInstance: false, tCreateTables: false, tContinue: false, } } } 

Vous pouvez ensuite instancier la structure en ne donnant que les valeurs autres que celles par défaut:

 let p = cParams { iInsertMax: 10, ..Default::default() }; 

Avec quelques modifications mineures apscopes à votre structure de données, vous pouvez tirer parti d’une implémentation par défaut dérivée automatiquement. Si vous utilisez #[derive(Default)] sur une structure de données, le compilateur créera automatiquement pour vous une fonction par défaut qui remplit chaque champ avec sa valeur par défaut. La valeur booléenne par défaut est false, la valeur intégrale par défaut est 0.

La valeur par défaut d’un entier qui est 0 est un problème car vous voulez que les champs entiers soient -1 par défaut. Vous pouvez définir un nouveau type qui implémente une valeur par défaut de -1 et l’utiliser au lieu de i64 dans votre structure. (Je n’ai pas testé cela, mais ça devrait marcher).

Cependant, je suggère de modifier légèrement votre structure de données et d’utiliser Option au lieu de i64 . Je ne connais pas le contexte de votre code, mais il semble que vous utilisiez la valeur spéciale -1 pour représenter le sens spécial “infini”, ou “il n’y a pas de max”. Dans Rust, nous utilisons une Option pour représenter une valeur facultative. Il n’y a pas besoin d’un hack -1. Une option peut être None ou Some(x) où x serait votre i64 ici. Il pourrait même s’agir d’un entier non signé si -1 était la seule valeur négative. La valeur par défaut de l’ Option est None , donc avec les modifications proposées, votre code pourrait ressembler à ceci:

 #[derive(Default)] struct cParams { iInsertMax: Option, iUpdateMax: Option, iDeleteMax: Option, iInstanceMax: Option, tFirstInstance: bool, tCreateTables: bool, tContinue: bool, } let p = cParams { iInsertMax: Some(10), ..Default::default() };