Home About

Rust: if let .... not

Introduction

Rust's error handling can be very exhaustive, both in terms of safety and verbosity. Consider the following example:

match get() {
	Some(value) => {
		println!("Do something with value: {}", value);
	},
	None => {}
}
	

If you have a lot of statements like this, your code can get very verbose, which is why this has been addressed by the if let syntax:

if let Some(value) = get() {
	println!("Do something with value: {}", value);
} else {
	/* error handling here */
}
	

Now this is much shorter, but what if you have multiple chained operations? Of course you can use and_then, but this will cause you the loss of any possibility of error management:

	get().and_then(parse) // What if "parse" fails? .and_then(output)
	

If you use if let, it will look like this:

if let Some(value) = get() {
	if let Some(parsed_value) = parse(value) {
		output(value);
	} else {
		println!("parsing failed");
	}
} else {
	println!("Getting the value failed");
}
	

Convoluted and hard to read.

if not let

There was a RFC for including something like if !let x = get() { error management }, but it didn't caught on. What nobody online however doesn't seem to mention is that you can create something like this:

let value = if let Some(value) = get() {value} else { println!("Couldn't get value!"); return; };
let parsed_value = if let Some(pv) = parse(value) {pv} else { println!("Couldn't parse value!"); return; };
	

I admit, that looks very convoluted. In another RFC the following syntax was proposed, but postponed for now:

let value = get() else return println!("No value!"); // Not valid
	

So I guess for now we will have to live with either the convoluted syntax or a lot of lines/indentation.