Bonjour,
Quand on écrit :
fn function_name(parameter_name: Type)
C'est en fait un cas particulier de :
fn function_name(pattern: Type)
Le pattern peut être un simple nom de paramètre, ou bien quelque chose de plus compliqué. Voici un exemple concret avec deux fonctions concat_1 et concat_2 qui font exactement la même chose :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| fn concat_1(x: (Vec<i32>, &[i32])) -> Vec<i32> {
let (mut v, s) = x;
v.extend_from_slice(s);
v
}
fn concat_2((mut v, s): (Vec<i32>, &[i32])) -> Vec<i32> {
v.extend_from_slice(s);
v
}
fn main() {
for f in [concat_1, concat_2] {
let result = f((vec![1, 2, 3], &[4, 5, 6]));
println!("Result: {result:?}");
}
} |
concat_1 et concat_2 prennent toutes les deux un couple en paramètre.
Dans concat_1, le paramètre s'appelle x. Ensuite, dans le code, le couple est déstructuré vers deux variables v (un vecteur muable) et s (un slice).
concat_2 fait la même chose d'un coup sans écrire une variable intermédiaire x.
Avec exactement la même logique, les deux fonctions suivantes push_zero_1 et push_zero_2 sont équivalentes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| fn push_zero_1(x: Vec<i32>) -> Vec<i32> {
let mut v = x;
v.push(0);
v
}
fn push_zero_2(mut v: Vec<i32>) -> Vec<i32> {
v.push(0);
v
}
fn main() {
for f in [push_zero_1, push_zero_2] {
let result = f(vec![1, 2, 3]);
println!("Result: {result:?}");
}
} |
Partager