刚接触 Rust 的时候可能会因为它遍地的 ResultOption 而困扰,会需要不厌其烦的结构出里面的值,就像:

let v = Ok(0);

let v = v.unwrap();
// 或
let v = v.expect("error occured");

Rust 也提供了更简单可读性更强的写法:

let v = Ok(0);

if let Ok(value) = v {
// ...
}
let v = Ok(0)?;

Rust 的 if 表达式可以解构,? 可以取出值或者将异常返回给上一级函数。

但在更加复杂的情况中,代码也难免会写的噪杂一点。比如更多的临时变量。

最简单的例子:

fn main() {
    print!("enter your email: ");
    stdout().flush().unwrap();
    let mut email = String::new();
    let stdin = stdin();
    stdin.read_line(&mut email).unwrap();

    println!("{}", email);
}

很好理解的例子,读取一行输入作为邮件。但你能看到其实我们最终需要的就是那个 email 变量,stdin 只用到了一次,我们最终需要的 email 变量其实也不需要是可变的。我们可以给他的写法小小的优化一下。

优化一

很自然的我们可以把它包装进一个函数里,返回需要的 email

fn main() {
    let email = read_email();

    println!("{}", email);
}

fn read_email() -> String {
  print!("enter your email: ");
    stdout().flush().unwrap();
    let mut email = String::new();
    let stdin = stdin();
    stdin.read_line(&mut email).unwrap();
		
		email
}

优化二

但我更喜欢这一种,

fn main() {
    let email = {
        print!("enter your email: ");
        stdout().flush().unwrap();
        let mut email = String::new();
        let stdin = stdin();
        stdin.read_line(&mut email).unwrap();
        email
    };

    println!("{}", email);
}

这种方法使用了一个临时作用域来处理读取 email 的操作,里面所有变量都会在作用域结束后释放掉,返回我们需要的 email。对于一些繁琐少量的操作,是比抽象成函数更适合的方式。

就像刚好有一个只能放数据线的小盒子,刚好收纳恼人的数据线。