由于分号在Rust中显然是可选的,为什么,如果我这样做:
fn fn1() -> i32 {
let a = 1
let b = 2
3
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
error: expected one of `.`, `;`, `?`, or an operator, found `let`
--> src/main.rs:3:9
|
2 | let a = 1
| - expected one of `.`, `;`, `?`, or an operator here
3 | let b = 2
| ^^^ unexpected token
Run Code Online (Sandbox Code Playgroud)
?
我正在为Duktape JavaScript解释器开发Rust包装器.在正常的用例中,调用堆栈将如下所示:
如果(5)调用会发生什么panic!?根据IRC上的各种Rust开发人员,尝试panic!从非Rust调用帧(如(3))内部可能会导致未定义的行为.
但根据Rust文档,捕获a的唯一方法panic!是使用std::task::try,这会产生额外的线程.还有rustrt::unwind::try,除了其他限制之外,它不能在单个线程中嵌套两次.
Benjamin Herr提出的一个解决方案是,如果(5)中的代码恐慌,则中止该过程.我已经将他的解决方案打包abort_on_panic为"工作"的价值,它似乎有效,包括"崩溃整个程序,但至少不会巧妙地破坏事物":
abort_on_panic!("cannot panic inside this block", {
panic!("something went wrong!");
});
Run Code Online (Sandbox Code Playgroud)
但是,这是一种模拟std::task::try没有线程/任务创建的开销的方法吗?
我想遍历Options的列表。如果其中之一有值,我想返回一个错误。这是一个人为的例子:
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(())
}
Run Code Online (Sandbox Code Playgroud)
添加另一个分号会导致错误,但删除分号不会。
为什么 return 语句后面的分号是可选的?
在惯用的 Rust 中应该使用哪种形式:分号还是没有分号?两者都被编译器接受并且似乎产生相同的结果。