在使用serde_json读取json文档时,我编写了以下代码行,以获得对返回值serde_json::from_str进行解包的结果:

fn get_json_content(content_s: &str) -> Option<Value> {
    let ms: String = serde_json::from_str(content_s).unwrap; // <--

    match serde_json::from_str(content_s) {
        Ok(some_value) => Some(some_value),
        Err(_) => None
    }
}

如您所见,我在呼叫unwrap的最后忘记了(),这导致了以下错误:

错误:试图获取方法的值

let ms: String = serde_json::from_str(content_s).unwrap;

但当我进一步观察这一点时,让我感到奇怪的是:

core::result::Result<_, serde_json::error::Error>

我理解下划线在匹配上下文中的含义,但要实例化泛型?那么这意味着什么呢?我在铁 rust 书、参考资料或网络搜索中找不到任何答案.

推荐答案

这是一个占位符.在这种情况下,这意味着编译器没有足够的信息来推断类型.

您可以在代码中使用它,让编译器为您推断类型.例如:

pub fn main() {
    let letters: Vec<_> = vec!["a", "b", "c"]; // Vec<&str>
}

这尤其方便,因为在许多情况下,您可以避免使用"turbofish operator":

fn main() {
    let bar = [1, 2, 3];
    let foos = bar.iter()
                  .map(|x| format!("{}", x))
                  .collect::<Vec<String>>(); // <-- the turbofish
}

vs

fn main() {
    let bar = [1, 2, 3];
    let foos: Vec<_> = bar // <-- specify a type and use '_' to make the compiler
                           //     figure the element type out
            .iter()
            .map(|x| format!("{}", x))
            .collect(); // <-- no more turbofish
}

Rust相关问答推荐

为什么拥有的trait对象的相等运算符移动了正确的操作数?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

定义采用更高级类型泛型的性状

铁 rust 中的共享对象实现特征

在自定义序列化程序中复制serde(With)的行为

如何为rust trait边界指定多种可能性

为昂贵的for循环制作筛子

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

用于实现获取 struct 体 id 的特征规范

为什么特征默认没有调整大小?

从管道读取后重置标准输入

使用占位符获取用户输入

Rust Axum 框架 - 解包安全吗?

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

从 Rust 中的 if/else 中的引用创建 MappedRwLockWriteGuard

将 Futures 的生命周期特征绑定到 fn 参数

试图理解 Rust 中的可变闭包

为实现特征的所有类型实现显示

传递 Option<&mut T> 时何时需要 mut

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?