I want the user to pass in command-line arguments to a simple function I've written in Rust. I know that I can use int::from_str(args[1]) to convert, but this returns an Option<int>, which means in order to pass it into a function that takes an int, like the one below, I have to use a match statement. But with n arguments, there are 2^n possibilities. Writing a series of nested match statements with something would be terrible. It would be ideal if there were a way to do something like:
// will return either Some(int) or None
let start = int::from_str(args[1]), end = int::from_str(args[2]);
if typeof(start) == Some && typeof(end) == Some {
println(fmt!("You entered: %d, %d", start, end);
} else {
println("Error with arguments.");
}
Is there any such method? That lets me test which member of an enum something is besides match?
The variants of an enum are all the same type (in this case, both None and Some(foo) are Option<int>), so what you actually want to do is check which variant start and end are. Fortunately Rust provides several options.
A direct translation of your code would be to use start.is_some() && end.is_some(). However this requires modifying the format string to be fmt!("You entered: %d, %d", start.get(), end.get()), because start and end are not integers, but still wrapped in the Some(...) variant. (This variant-test is something that has to be written on a per-enum basis, there's no build-in functions that allow you to perform the test for any enum.)
The more idiomatic way would be something like this:
// will return either Some(int) or None
let start_opt = int::from_str(args[1]), end_opt = int::from_str(args[2]);
match (start_opt, end_opt) {
// only matches if both are Some
(Some(start), Some(end)) => println(fmt!("You entered: %d, %d", start, end),
// will match when either (or both) are None
_ => println("Error with arguments.");
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With