不能 return 来自 Rocket 路由的字符串
Can't return String from Rocket route
我正在尝试创建一个 returns 到客户端的字符串的 Rocket 路由,但我无法让它工作。到目前为止,这就是我所拥有的:
#![feature(plugin)]
#![plugin(rocket_codegen)]
#[macro_use]
extern crate serde_derive;
extern crate toml;
extern crate rocket;
mod utilities;
mod pipeline_config;
mod assets;
use std::path::PathBuf;
#[get("/resources/<path..>")]
fn get_resource(path: PathBuf) -> Result<String, ()> {
if let Some(page_path) = path.to_str() {
match assets::get(&format!("{}/{}", "resources", page_path)) {
Ok(page) => Ok(utf8_to_string(page)),
Err(e) => Err(()),
}
}
Err(())
}
fn main() {
let rocket_obj = rocket::ignite();
rocket_obj.mount("/", routes![get_resource]).launch();
}
pub fn utf8_to_string(bytes: &[u8]) -> String {
let vector: Vec<u8> = Vec::from(bytes);
String::from_utf8(vector).unwrap()
}
看起来应该可以,但它给我一个错误expected (), found enum std::result::Result
:
error[E0308]: mismatched types
--> src/main.rs:18:9
|
18 | / match assets::get(&format!("{}/{}", "resources", page_path)) {
19 | | Ok(page) => Ok(utf8_to_string(page)),
20 | | Err(e) => Err(()),
21 | | }
| | ^- help: try adding a semicolon: `;`
| |_________|
| expected (), found enum `std::result::Result`
|
= note: expected type `()`
found type `std::result::Result<std::string::String, ()>`
这对我来说毫无意义,因为我要返回 Result
和 String
。
当您使用函数式风格时,将一个函数视为一个表达式。您的函数 get_resource
有两个并排放置的表达式。编译器什么都不懂。您必须将备选方案放在 else
分支中, 即 :如果我能找到一些路径,请执行此操作;否则这是一个错误:
fn get_resource(path: PathBuf) -> Result<String, ()> {
if let Some(page_path) = path.to_str() {
match assets::get(&format!("{}/{}", "resources", page_path)) {
Ok(page) => Ok(utf8_to_string(page)),
Err(e) => Err(()),
}
} else {
Err(())
}
}
换句话说,您可以将函数视为逻辑树,其中每个 if
或 match
块都是一组分支。程序将根据输入遵循这棵树中的一条路径:所以你必须只有一个树干,否则没有意义。
我正在尝试创建一个 returns 到客户端的字符串的 Rocket 路由,但我无法让它工作。到目前为止,这就是我所拥有的:
#![feature(plugin)]
#![plugin(rocket_codegen)]
#[macro_use]
extern crate serde_derive;
extern crate toml;
extern crate rocket;
mod utilities;
mod pipeline_config;
mod assets;
use std::path::PathBuf;
#[get("/resources/<path..>")]
fn get_resource(path: PathBuf) -> Result<String, ()> {
if let Some(page_path) = path.to_str() {
match assets::get(&format!("{}/{}", "resources", page_path)) {
Ok(page) => Ok(utf8_to_string(page)),
Err(e) => Err(()),
}
}
Err(())
}
fn main() {
let rocket_obj = rocket::ignite();
rocket_obj.mount("/", routes![get_resource]).launch();
}
pub fn utf8_to_string(bytes: &[u8]) -> String {
let vector: Vec<u8> = Vec::from(bytes);
String::from_utf8(vector).unwrap()
}
看起来应该可以,但它给我一个错误expected (), found enum std::result::Result
:
error[E0308]: mismatched types
--> src/main.rs:18:9
|
18 | / match assets::get(&format!("{}/{}", "resources", page_path)) {
19 | | Ok(page) => Ok(utf8_to_string(page)),
20 | | Err(e) => Err(()),
21 | | }
| | ^- help: try adding a semicolon: `;`
| |_________|
| expected (), found enum `std::result::Result`
|
= note: expected type `()`
found type `std::result::Result<std::string::String, ()>`
这对我来说毫无意义,因为我要返回 Result
和 String
。
当您使用函数式风格时,将一个函数视为一个表达式。您的函数 get_resource
有两个并排放置的表达式。编译器什么都不懂。您必须将备选方案放在 else
分支中, 即 :如果我能找到一些路径,请执行此操作;否则这是一个错误:
fn get_resource(path: PathBuf) -> Result<String, ()> {
if let Some(page_path) = path.to_str() {
match assets::get(&format!("{}/{}", "resources", page_path)) {
Ok(page) => Ok(utf8_to_string(page)),
Err(e) => Err(()),
}
} else {
Err(())
}
}
换句话说,您可以将函数视为逻辑树,其中每个 if
或 match
块都是一组分支。程序将根据输入遵循这棵树中的一条路径:所以你必须只有一个树干,否则没有意义。