generics - 用下划线实例化 Rust 泛型是什么意思?

标签 generics rust

在使用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 ,这导致了以下错误:

error: attempted to take value of method unwrap on type core::result::Result<_, serde_json::error::Error>

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
}

对比

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
}

关于generics - 用下划线实例化 Rust 泛型是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215739/

相关文章:

winapi - WinAPI OpenQuery产生错误

typescript - useAnimatedGestureHandler onStart 方法正确的上下文参数类型

java - 在运行时使用 getConstructor() 创建泛型类的实例 : NoSuchMethodException()

rust - libwasm_bindgen-a2e136f9a24e6618.rlib 挂起,编译时不占用 CPU

rust - 如何在 Rust 中创建可用作 Reader、Writer 或 Seek 的内存对象?

rust - "cannot find macro"宏自己的doc测试出错

pointers - 为什么在 Rust 中修改字符串变量时指针地址没有改变?

powershell - F# 异步<_> 到异步<obj>

java - java中的简单泛型列表

java - 将 Java 8 Lambda 与泛型一起使用