Est-il plus rapide/plus court chemin pour initialiser des variables dans une Rouille struct?
Dans l'exemple suivant, je préférerais de beaucoup d'attribuer une valeur à chaque champ de la structure dans la déclaration des champs. Sinon, elle prend une autre déclaration pour chaque champ d'affecter une valeur dans les champs. Tout ce que je veux être en mesure de faire est d'attribuer des valeurs par défaut lorsque la structure est instancié.
Est-il une manière plus succincte de faire cela?
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 devez vous connecter pour publier un commentaire.
Vous pouvez fournir des valeurs par défaut pour votre structure par la mise en œuvre de la
Default
trait. Ledefault
fonction ressemblerait votrenew
fonction:Vous pouvez ensuite créer une instance de la structure en ne donnant que des non-valeurs par défaut:
Avec quelques modifications mineures à votre structure de données, vous pouvez profiter d'une automatiquement par défaut de mise en œuvre. Si vous utilisez
#[derive(Default)]
sur une structure de données, le compilateur va créer automatiquement une valeur par défaut de la fonction pour vous qui remplit chaque champ avec sa valeur par défaut. Le booléen par défaut la valeur est false, la valeur par défaut valeur intégrale est de 0.Un entier de valeur par défaut étant 0 est un problème ici, puisque vous voulez les champs entier à -1 par défaut. Vous pouvez définir un nouveau type qui implémente une valeur par défaut -1 et l'utiliser à la place de
i64
dans votre structure. (Je n'ai pas testé, mais ça devrait fonctionner).Cependant, je vous suggère de modifier légèrement la structure de données et l'utilisation
Option<i64>
au lieu dei64
. Je ne connais pas le contexte de votre code, mais on dirait que vous êtes à l'aide de la valeur de -1 pour représenter la signification spéciale "infini", ou "il n'y a pas de max". Dans la Rouille, nous utilisons unOption
pour représenter éventuellement de la valeur actuelle. Il n'y a pas besoin de -1 hack. Une option peut être soitNone
ouSome(x)
où x serait votrei64
ici. Il pourrait même être un entier non signé si -1 est la seule valeur négative. La valeur par défautOption
valeur estNone
, donc, avec les modifications proposées, votre code pourrait ressembler à ceci:struct Foo { val: i64 = 0 }
) a été proposé et peuvent donc apparaître dans les versions ultérieures.let p: cParams = Default::default();
. Si vous avez de mettre en œuvre laDefault
trait par vous-même ou laisser le compilateur mettre en œuvre, en utilisant#[deriving(Default)]
devrait pas faire de différence dans la façon dont il est utilisé.#[deriving(Default)]
alors tout est réglé par défaut pour vous. Le seul usage de l'écritureDefault::default()
manuellement est de se spécialiser pour votre cas. Donc... la valeur par défaut est déjà la valeur par défaut.Default
pour une struct?