Comment by almostgotcaught

3 days ago

> it shouldn't break fundamental rules of the language

it doesn't? you simply don't understand what a match statement is.

https://doc.rust-lang.org/book/ch19-03-pattern-syntax.html

    let num = Some(4);

    match num {
        Some(x) if x % 2 == 0 => println!("The number {x} is even"),
        Some(x) => println!("The number {x} is odd"),
        None => (),
    }

notice that x is bound to 4.

Which x? There are two in your code, one for each time you introduce a pattern Some(x) and each x has scope which of course ends when that pattern is done with

Notice that the Python doesn't work this way, we didn't make a new variable but instead changed the existing one.

Also, the intent in the Python was a constant, in Rust we'd give this constant an uppercase name by convention, but regardless it's a constant and so of course matching against a constant does what you expect, it can't re-bind a constant, 404 is a constant and so is `const NOT_FOUND: u16 = 404;`

  • > Which x? There are two in your code, one for each time you introduce a pattern Some(x) and each x has scope which of course ends when that pattern is done with

    if each x's scope ends at the end of each case doesn't that mean there's only one x?

    > we didn't make a new variable but instead changed the existing one.

    so because python doesn't have scopes except for function scopes it shouldn't ever have any new features that intersect with scope?

    • Also this is pretty much in line for the rest of Python leaving variables around.

          for x in [1]:
            pass
          print(x) # => 1
      

      The match statement presented is equivalent to an assignment, you do have to know that, but then it's just regular Python.

      5 replies →