0

我正在尝试创建一个向客户端返回字符串的 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, ()>`

这对我来说毫无意义,因为我要返回 aResult和 a String

4

1 回答 1

3

当你使用函数式风格时,将一个函数视为一个表达式。您的函数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(())
    }
}

换句话说,您可以将函数视为逻辑树,其中每个ifmatch块都是一组分支。程序将根据输入遵循此树中的路径:因此您必须只有一个树干,否则没有意义。

于 2017-06-28T07:15:38.143 回答