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