1

I'm new in Rust and while learning the standard library I found the expression Some(x @ 6..=10) in a match example. What does x @ 6..=10 mean?

pretzelhammer
  • 13,874
  • 15
  • 47
  • 98

3 Answers3

3

something @ pattern is a way to do the pattern matching. Normally a match branch creates variables for parts of the matched value. But something @ pattern creates a variable something and moves or copies the whole value into it.

Just a learner
  • 26,690
  • 50
  • 155
  • 234
2

The syntax low ..= high allows you to match on all numbers within the range from low to high (inclusive). The @ in pattern match expressions allows you to bind a variable to the matched value. Here's an example to illustrate their uses:

fn log_num(maybe_num: Option<i32>) {
    match maybe_num {
        None => println!("didn't get a number"),
        Some(x @ 0..=5) => println!("got number {} between 0-5", x),
        Some(y @ 6..=10) => println!("got number {} between 6-10", y),
        Some(z) => println!("got number {} larger than 10", z),
    }
}

fn main() {
    log_num(None);
    log_num(Some(3));
    log_num(Some(7));
    log_num(Some(15));
}

playground

pretzelhammer
  • 13,874
  • 15
  • 47
  • 98
1

This is a form of pattern matching, specifically @ bindings. In the form...

let y = Some(3);
if let Some(x @ 6..=10) = y {
    // ...
}

... the variable y needs to be a Some(...) to match, and the inner value will be assigned to x if it is within the range 6 to 10 (inclusive). In the example above, the if-block will not be executed, because while y destructures to a Some(...), the inner value does not fit the pattern and therefor x does not bind.

user2722968
  • 13,636
  • 2
  • 46
  • 67