rust - 为什么return语句后面的分号是可选的?
问题描述
我想遍历一个Option
s 列表。如果其中一个有值,我想返回一个错误。这是一个人为的例子:
fn test(options: &[Option<u8>]) -> Result<(), &u8> {
for option in options {
match option {
None => (),
Some(value) => {
// do some stuff here, so I can't just go
// Some(value) => return Err(value),
return Err(value); // this semicolon is optional
}
}
}
Ok(())
}
添加另一个分号会导致错误,但删除分号不会。
为什么return语句后面的分号是可选的?
在惯用的 Rust 中应该使用哪种形式:分号还是不使用分号?两者都被编译器接受并且似乎产生相同的结果。
解决方案
为什么return语句后面的分号是可选的?
问题的症结在于这return
不是 Rust 中的语句(本身),而是返回1的表达式。!
这意味着您的测试用例的惯用格式实际上是:
fn test(options: &[Option<u8>]) -> Result<(), &u8> {
for option in options {
match option {
None => (),
Some(value) => return Err(value),
}
}
Ok(())
}
请注意,我删除了表达式{}
周围的。return
的右边=>
是一个表达式,return Err(value)
是一个表达式,它正好适合,不需要额外的绒毛。
1 !
表示编程语言理论中的底层类型,一种没有实例的类型,用于表示发散的表达式。它也被称为 NEVER 类型。
正如Rust 中分号是可选的吗?表达式可以通过添加一个;
.
由于需要表达式的右侧=>
,您不能直接使用return Err(value);
(因为现在是语句),但您可以使用恰好包含语句的块表达式,并且可能包含最终表达式。
因此,可选;
是块的一个属性:
- 包含单个语句的块,没有最终表达式:
{ return Err(value); }
. 它的类型是()
. - 仅包含最终表达式的块:
{ return Err(value) }
。它的类型是!
.
推荐阅读
- laravel - laravel when() 辅助函数在值为 false 时执行函数
- mysql - MySQL Query with Left Join、Order By 和 Limit 以及其他连接
- rundeck - 绕过 Rundeck 中的默认节点执行程序
- javascript - Treat inline script tags with type="text/plain" as JavaScript
- vue.js - NuxtJS 混合问题
- python - Python Kivy - 从另一个 Python 文件更改屏幕
- laravel - Laravel 从使用 POST 请求调用的函数返回并重定向到视图
- httpclient - 关闭 CloseableHttpClient 时是否还必须关闭 PoolingHttpClientConnectionManager?
- java - n 天后删除日志,使用 log4j vanilla(没有额外的包)
- python - Chatterbot 属性错误。ChatBot 对象没有找到属性