Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 用下划线实例化锈菌泛型意味着什么?_Generics_Rust - Fatal编程技术网

Generics 用下划线实例化锈菌泛型意味着什么?

Generics 用下划线实例化锈菌泛型意味着什么?,generics,rust,Generics,Rust,在使用serde_json读取json文档时,我编写了以下代码行,以获得从_str解包serde_json::返回值的结果: 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) {

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

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
    }
}
但当我进一步看这个问题时,让我感到奇怪的是:

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

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

这是一个占位符。在此上下文中,这意味着没有足够的信息供编译器推断类型

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

pub fn main() {
    let letters: Vec<_> = vec!["a", "b", "c"]; // Vec<&str>
}
pub fn main(){
让字母:Vec=Vec![“a”、“b”、“c”];//Vec
}
这特别方便,因为在许多情况下,您可以避免使用:

fn main(){
设bar=[1,2,3];
设foos=bar.iter()
.map(|x |格式!(“{}”,x))

收集::();//另请参阅。谢谢。我更喜欢对所有类型都显式,因为省略类型只会使代码不可读,这就是为什么我总是在let绑定中指定类型。我知道这似乎是一种反模式的生锈,但我在找出事物的类型上浪费了太多的时间,所以我宁愿显式。@Zephilim:有一个inte关于类型省略的争论停滞不前;一些人认为类型对于理解是必要的,另一些人则认为它们会扰乱真实信息。这最终是一个非常个人的选择:)你可以猜到我的观点是什么。如果我有一个像样的IDE可以定义事物,那也不会太糟糕,但这不是我目前的设置nt。我只是使用Atom作为文本编辑器,但做不到这一点。我尝试了VisualRust,但目前没有希望。仅供参考,对于turbofish,您可能可以使用
而不是
pub fn main() {
    let letters: Vec<_> = vec!["a", "b", "c"]; // Vec<&str>
}
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
}