I'm trying to access command line arguments. If the argument exists, do something, if not, do nothing. I have this code:
fn main() {
if let Some(a) = std::env::args().nth(2) {
let b = a;
}
println!("{}", a);
}
I am not able to access a
or b
outside of this scope:
error[E0425]: cannot find value `a` in this scope
--> src/main.rs:6:20
|
6 | println!("{}", a);
| ^ not found in this scope
How do I resolve this? Is there a better way to approach what I'm trying to do?
For an understanding of what's going on, have a look at the answer by Shepmaster
I'm not sure what you expect to happen in case the condition is not met. If you just want to abort the program in that case, the idiomatic Rust way is to use
unwrap
orexpect
.If you want a default value in case the argument does not exist, you can use
unwrap_or
.As a further alternative, you can use the feature that in Rust almost everything is an expression:
The idiomatic Rust way to write that would be with closures and
unwrap_or_else
:In Rust, it's always useful to ask yourself "what is the type of this variable?". Let's run with your example and pretend it works:
What is the type of
b
at theprintln
line? Maybe you'd like it to be a boolean, but what is the type if theif
clause doesn't pass? There isn't one! In other languages, maybe that would benil
ornull
, but Rust encodes that information with theOption
type - that's whereSome
andNone
come from!Additionally, scopes are very meaningful in Rust. Items defined inside a scope don't leak outside that scope:
Between the two of these pieces, the code you want to write isn't possible. I agree that the right solution is to embed the println inside the if: