nrc/r4cppp

Compile error in enums code

Opened this issue · 1 comments

In https://github.com/nrc/r4cppp/blob/master/data-types.md you write:

enum Expr {
    Add(i32, i32),
    Or(bool, bool),
    Lit(i32)
}

fn foo() {
    let x = Or(true, false);   // x has type Expr
}

This code throws the following errors:

error[E0425]: cannot find function, tuple struct or tuple variant 'Or' in this scope
   --> enums.rs:10:13
    |
10  |     let x = Or(true, false); // x has type Expr
    |             ^^
    |
help: a tuple variant with a similar name exists
    |
10  |     let x = Ok(true, false); // x has type Expr
    |             ^^
help: possible candidate is found in another module, you can import it into scope
    |
1   | use Expr::Or;
    |

error: aborting due to previous error

For more information about this error, try 'rustc --explain E0425'..

rustc 1.42.0 (b8cedc004 2020-03-09)

Fix: Add namespace
let x = Expr::Or(true, false)

Same on the snippet below:

fn bar(e: Expr) {
    match e {
        Add(x, y) => println!("An `Add` variant: {} + {}", x, y),
        Or(..) => println!("An `Or` variant"),
        _ => println!("Something else (in this case, a `Lit`)"),
    }
}

Same fix. Alternative:

use Expr::Add;
use Expr::Or;
nrc commented

Using the explicit prefix is the idiomatic fix - this example is so old that it uses the old enum rules!