2
extern crate serde_json;

use serde_json::Value;

use std::fs::File;
use std::io::prelude::*;

fn main() {
    let filepath = "./map/test/anhui.txt";
    match File::open(filepath) {
        Err(why) => println!("Open file failed : {:?}", why.kind()),
        Ok(mut file) => {
            let mut content: String = String::new();
            file.read_to_string(&mut content);
            println!("{}", &mut content);
            serde_json::from_str(&mut content);
        }
    }
}

错误信息:

error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [--explain E0282]
  --> src/main.rs:16:17
   |>
16 |>                 serde_json::from_str(&mut content);
   |>                 ^^^^^^^^^^^^^^^^^^^^
4

1 回答 1

4

要修复它,您需要告诉编译器您期望serde_json::from_str. 所以你可以换行

serde_json::from_str(&mut content);

serde_json::from_str::<Value>(&mut content);

您需要指定类型的原因是因为serde_json::from_str泛型函数需要将类型实例化为具体函数。通常 rustc 会处理它,并推断您要使用的类型,但在这种情况下,没有足够的信息让编译器为您推断它,因为类型仅在函数的结果中被引用,而结果永远不会在给定的代码中使用。

您可能还想使用from_str表达式的结果,否则函数调用什么也不做。如果在使用 let 绑定时指定类型,编译器将能够推断类型,如下所示:

let result: Value = serde_json::from_str(&mut content);
于 2016-09-02T05:37:48.040 回答