Récemment, je lisais un article sur le match
dans la section Livre de la rouille . Ce qui m'a troublé, c'est la différence entre Binding
y Destructuring
. D'après ce que j'ai compris, les deux permettent d'accéder aux variables d'une expression. Binding
peut spécifier une correspondance de plage, mais vous pouvez le faire avec Destructuring
y Guards
. Alors quelqu'un peut-il montrer des cas où seulement Binding
peut faire ou expliquer la différence réelle entre ces deux concepts ?
Réponse
Trop de publicités?Vous pouvez voir ici un scénario dans lequel une liaison est nécessaire parce que la déstructuration ne répond pas à notre besoin actuel. Si nous déstructurons simplement la structure, nous avons accès au champ interne de la structure. Cela signifie que les valeurs utilisées sur le côté droit dans le bras de match n'auront pas accès aux méthodes définies sur la structure.
Dans mon exemple, je fais également une correspondance avec une valeur spécifique de ex.value
cela n'est bien sûr pas nécessaire et peut être fait avec une garde à la place, cette façon est cependant plus concise si la condition n'est pas très complexe.
struct Example {
some_value: i32,
some_other_value: String
}
impl Example {
pub fn some_fn(&mut self) {}
}
fn main() {
let ex = Example { some_value: 42, some_other_value: "Foobar".to_string() };
match ex {
mut new_ex @ Example { some_value: 43, .. } => new_ex.some_fn(),
Example { some_value: first, some_other_value: second } => println!("first value: {}\nSecond value: {}", first, second),
}
}
1 votes
Je pense que le document manque d'un type d'exemple, vous pouvez lier l'ensemble du modèle, ce qui n'est pas possible avec les destructions et les gardes, merci de vérifier : play.rust-lang.org/ .