分类

Rust 语言中的瑕疵 - 省去 return

2017-11-07 20:55 rust

Rust 语法中的 return 关键字是可以省去的, 这也是推荐做法, 但是某些条件下会带来问题.

先看例子:

fn max(a: i32, b: i32) -> i32 {
    if a > b {
        a
    } else {
        b
    }
}

这里, a 以及 b 都作为表达式, 直接返回它们的值. 这种写法对于简洁的函数, 倒还可以接受, 如果内部有多层嵌套的话, 就很容易多加一个分号, 就像这样: a;, 尽管这里编译器会报一条警告, 但并不是所有时候都会如此, 再看下面的例子:

fn max_plus_one(a: i32, b: i32) -> i32 {
    if a > b {
        1 + a;
    }
    b + 1
}

fn main() {
    println!("{}", max_plus_one(2, 1));
}

以上代码, 编译器甚至连条警告信息都没有打印.

省去 return 以及 ;, 并不能省去多少体力, 相反地, 让代码有了更多出错的机会. 除此之外, 这种写法也与一般的语言里面有差别, 在编写以及阅读代码时, 都要多留个心眼, 会在这些不起眼的 细节上花功夫. 上面的代码还只是少量的几行, 如果嵌的层次多了, 读代码时就得上下来回地翻找了, 远不如 return xxx; 来得更显眼.

当然, 对于 let-if 语句, 或许有些用武之地:

fn main() {
    let condition = true;
    let number = if condition {
        5
    } else {
        6
    };

    println!("The value of number is: {}", number);
}

但是, 如果按照旧的方式来写:

fn main() {
    let condition = true;
    let number;
    if condition {
        number = 5;
    } else {
        number = 6;
    }

    println!("The value of number is: {}", number);
}

差异并不大, 而且如果 if 语句里面逻辑复杂一些的话, let-if 这种写法的可读性跟上面的函数一样是很差的. 另外, let-if 语句后面的 ; 要记得加上 :)