如何在匹配臂中表达变量类型?
How to express variable type in match arm?
我正在尝试使用 Rust 中的 serde_json
解析一段 json 字符串。我想使用以下语法匹配解析结果:
match serde_json::from_str(msg.to_text().unwrap()) {
Ok(result) => {
println!("Parsed: {}", response.text);
}
Err(error) => {
println!("Failed to parse: {}", error);
}
}
但是编译器向我抱怨他不知道 result
的类型,当然,他是对的。但是我怎样才能告诉他 result
的类型呢?我尝试了以下代码,但它也没有用。所以我想在match arm中表达变量的类型
match serde_json::from_str(msg.to_text().unwrap()) {
Ok(result: Response) => {
println!("Parsed: {}", response.text);
}
Err(error) => {
println!("Failed to parse: {}, {}", error, msg.to_text.unwrap());
}
}
有几种方法可以指定类型。您可以使用 type parameters in the function call 显式指定它,即使用此语法 func::<T>()
.
match serde_json::from_str::<Response>(json) {
Ok(response) => {}
Err(err) => {}
}
或者,您可以将初始结果分配给一个变量,并在其中提示类型,即
let res: Result<Response, _> = serde_json::from_str(json);
match res {
Ok(response) => {}
Err(err) => {}
}
或
match serde_json::from_str(json) {
Ok(response) => {
let response: Response = response;
}
Err(err) => {}
}
最后你还可以使用@ bindings。但是,如果您的类型是 enum
,这将不起作用,因为您必须指定您想要的确切变体。
例如,如果 Response
是一个 enum
你可以有多个 Ok(resp @ Response::???)
匹配臂。但是你不能有一个 Ok(resp @ Response)
火柴臂。
match serde_json::from_str(json) {
Ok(response @ Response { .. }) => {}
Err(err) => {}
}
我正在尝试使用 Rust 中的 serde_json
解析一段 json 字符串。我想使用以下语法匹配解析结果:
match serde_json::from_str(msg.to_text().unwrap()) {
Ok(result) => {
println!("Parsed: {}", response.text);
}
Err(error) => {
println!("Failed to parse: {}", error);
}
}
但是编译器向我抱怨他不知道 result
的类型,当然,他是对的。但是我怎样才能告诉他 result
的类型呢?我尝试了以下代码,但它也没有用。所以我想在match arm中表达变量的类型
match serde_json::from_str(msg.to_text().unwrap()) {
Ok(result: Response) => {
println!("Parsed: {}", response.text);
}
Err(error) => {
println!("Failed to parse: {}, {}", error, msg.to_text.unwrap());
}
}
有几种方法可以指定类型。您可以使用 type parameters in the function call 显式指定它,即使用此语法 func::<T>()
.
match serde_json::from_str::<Response>(json) {
Ok(response) => {}
Err(err) => {}
}
或者,您可以将初始结果分配给一个变量,并在其中提示类型,即
let res: Result<Response, _> = serde_json::from_str(json);
match res {
Ok(response) => {}
Err(err) => {}
}
或
match serde_json::from_str(json) {
Ok(response) => {
let response: Response = response;
}
Err(err) => {}
}
最后你还可以使用@ bindings。但是,如果您的类型是 enum
,这将不起作用,因为您必须指定您想要的确切变体。
例如,如果 Response
是一个 enum
你可以有多个 Ok(resp @ Response::???)
匹配臂。但是你不能有一个 Ok(resp @ Response)
火柴臂。
match serde_json::from_str(json) {
Ok(response @ Response { .. }) => {}
Err(err) => {}
}