由于分号在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)
?
我正在编写一个函数,该函数在成功(和失败)时返回 serde_json::Value。以前在 Rust 中,我一直省略分号以从函数返回数据,如下面的代码示例所示:
use serde_json::{Result, Value};
use core::result::Result as ResultCore;
fn returning_function() -> ResultCore<Value, Value> {
let data = r#"
{
"status": "ok",
"response": {
"data": "secret message!"
}
}
"#;
match str_to_json(data) {
Ok(json_data) => match json_data["status"].as_str() {
Some(status_str) => {
if status_str == "ok" {
Ok(json_data["response"].clone())
}
}
None => eprintln!("\"status\" was not a string")
}
Err(error) => eprintln!("something went wrong! here's what: {}", error)
}
Err(serde_json::Value::Null)
}
fn str_to_json(json_data: &str) -> Result<Value> {
Ok(serde_json::from_str(json_data)?)
}
Run Code Online (Sandbox Code Playgroud)
这是我不明白的部分:这不能编译。Rust …
我正在学习 Rust,我发现一些与函数混淆的东西。根据官方参考,返回表达式:
.. [is] 用关键字 return 表示。计算返回表达式将其参数移动到当前函数的输出槽中,破坏当前函数激活帧,并将控制权转移到调用者帧。
所以,这个程序有效:
fn main() {
let current_hour = 10;
let message = get_message(current_hour);
println!("Good {0}", message);
}
fn get_message(current_hour: i32) -> &'static str {
if current_hour < 11 {
return "Morning"
}
else if current_hour < 17 {
return "Afternoon"
}
else {
return "Evening"
}
}
Run Code Online (Sandbox Code Playgroud)
当我在“返回”表达式中添加分号时,它仍然有效:
fn main() {
let current_hour = 10;
let message = get_message(current_hour);
println!("Good {0}", message);
}
fn get_message(current_hour: i32) -> &'static str {
if current_hour …Run Code Online (Sandbox Code Playgroud) 我在函数末尾有一个相当复杂的match语句(带有嵌套等)。ifthis 的每个分支都应该显式地从函数返回,或者调用某个-> !函数(例如process::exit)。
为了与其他程序员进行通信,并保护自己免受自己的伤害,我想告诉编译器断言此后的任何内容match都是无法访问的。我知道它知道如何静态地执行此操作,因为如果我将代码放在那里,我会收到编译时警告。
我尝试过的两件事:
将match语句分配给let _: ! = match .... 然而,这!仍然是实验性的,所以这不起作用
将其包裹match在封口中move || -> ! { match ... }();。return但是,这限制了我只能从父函数中进行操作。
我的情况的具体细节不一定适用于一般情况:
fn main() -> ()()返回函数,要么分支到!返回函数return条件逻辑中的 -ing 函数需要使用由匹配项展开的值