gpt4 book ai didi

rust - 为什么 return 语句后面的分号是可选的?

转载 作者:行者123 更新时间:2023-12-03 11:25:19 24 4
gpt4 key购买 nike

我想遍历一个列表 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 中应该使用哪种形式:分号还是没有分号?两者都被编译器接受并且似乎产生相同的结果。

最佳答案

Why is the semicolon after the return statement optional?


问题的关键在于 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 类型。

Are semicolons optional in Rust? 中所述通过添加 ; 可以将表达式转换为 Rust 中的语句.
=> 的右侧需要表达式,不能直接使用 return Err(value); (因为它现在是一个语句)但是您可以使用恰好包含语句的块表达式,并且可能是最终表达式。
可选 ;因此是块的一个属性:
  • 包含单个语句的块,没有最终表达式:{ return Err(value); } .它的类型是 () .
  • 仅包含最终表达式的块:{ return Err(value) } .它的类型是 ! .
  • 关于rust - 为什么 return 语句后面的分号是可选的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62637801/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com