分类

Rust 中的 never 类型

2019-07-10 11:07 rust

这个特性目前还只有在 nightly 版本中可用, 但我觉得这是一个很差劲的设计.

pub fn exit(status: i32) -> ! {
  nc::exit(status);
}

上面的 exit() 函数返回的类型就是 never 类型, 表示它返回的不是任何其它类型的 结果. 因为调用它之后, 整个进程就退出了.

rust 官方文档中还列举了一个用例:

fn server_loop() -> ConnectionError {
    loop {
        match get_request() {
            Err(err) => break err,
            Ok((client, request)) => {
                let response = request.process();
                response.send(client);
            },
        }
    }
}

使用 never 类型, 可以消除枚举类型中的某些项. 上面的代码换成 never 类型之后, 可以改写为;

fn server_loop() -> Result<!, ConnectionError> {
    loop {
        let (client, request) = get_request()?;
        let response = request.process();
        response.send(client);
    }
}

就是说, 如果该函数会返回, 那它的返回值一定是一个 Err<ConnectionError> 类型. 看起来是少写了一两行代码, 但我不认同这种做法, 它也并没有解决什么问题.

现在来看, rust 在积累这样的毛病:

  • 为了让代码少写几行, 会引入一个在别的常用编程语言中不会使用的概念和写法
  • 为了支持一个小特性, 完全改变之前在别的语言中的通用写法, 比如函数最后一行不需要写 return x;, 而要写成 x

像这样的特性, 反而让 rust 更加难学, 目前 rust 已经让开发者觉得太过复杂了, 再照这样的发展 方向走下去的话, 很难说不会重走 c++ 的老路.