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++ 的老路.