fn main() {
let mut scores:HashMap<String, i32> = HashMap::new();
scores.insert(String::from("blue"),10);
let keys = vec![String::from("Aqua"),String::from("Yellow")];
let values = vec![10,20];
let mut scores:HashMap<_,_> = keys.iter().zip(values.iter()).collect();
scores.insert(String::from("blue"), 50);
scores.entry(String::from("Yellow")).or_insert(32);
}
1
共 5 条评论, 1 页
评论区
写评论所以说由iter()创建的HashMap里面全放的是引用,而into_iter()才是放的值!/(ㄒoㄒ)/~~
你中间注射那两行不行的原因是因为你创建了临时值,而没有绑定到任何变量上,也就是没有其所有权。编译器会任何此临时值生命周期也是“临时”的,也就是方法执行完就被销毁。
String::from("blue")在insert后就会被销毁掉,但是scores要在main方法结束时销毁,那么在scores销毁之前如果上面的语法是正确的那就会出现悬垂指针。 所以在rust中,我们如果这么写(将值绑定到变量上):
可以保证key和value的能“活”到main结束。 这两种写法在rust中是完全不一样的,所以从其他语言刚过来要仔细体会下。
--
👇
Zac.R: ```rust fn main() { let mut scores: HashMap<String, i32> = HashMap::new(); scores.insert(String::from("blue"), 10);
}
error[E0308]: mismatched types --> src/main.rs:11:19 | 11 | scores.insert(String::from("blue"), 50usize); | ^^^^^^^^^^^^^^^^^^^^ | | | expected
&String
, found structString
| help: consider borrowing here:&String::from("blue")
error[E0308]: mismatched types --> src/main.rs:11:41 | 11 | scores.insert(String::from("blue"), 50usize); | ^^^^^^^ | | | expected
&{integer}
, foundusize
| help: consider borrowing here:&50usize
There are three common methods which can create iterators from a collection:
iter(), which iterates over &T. iter_mut(), which iterates over &mut T. into_iter(), which iterates over T.
let mut scores:HashMap<_,_> = keys.into_iter().zip(values.into_iter()).collect();
谢谢,使用into_iter(),可以解决问题,并且使用into_iter()后注释掉的两行去掉&引用能运行,不知道怎么从原理上理解,感觉建立的scores还是那个score啊?!!! 使用下面的scores.insert(&key,&value);能够成功添加,但是上面注释掉的两行就不行,应该是关于生命周期的问题,如果要像上面那样,可以怎样改写呢?
--
👇
modraedlau: 首先,Rust编译器是我们很好的朋友,编译器对编译错误的相关诠释是比较贴心的。我们来看看编译错误提示:
这说明最后的scores的类型是HashMap<&String, &usize>的类型(注:usize为默认的integer类型)。 仔细看下scores赋值的代码,可以发现是因为iter的使用,查下rust的iter相关文档:https://doc.rust-lang.org/std/iter/index.html,可以看到这样的说明:
那么如何修改代码通过编译呢,一种方法是采用into_iter替代iter:
最后要解释的是into_iter的所有会发生转移,也就是说keys和values中的String及整型数值的所有权都会移入到scores中,相当于keys和values都被消耗掉。
首先,Rust编译器是我们很好的朋友,编译器对编译错误的相关诠释是比较贴心的。我们来看看编译错误提示:
这说明最后的scores的类型是HashMap<&String, &usize>的类型(注:usize为默认的integer类型)。 仔细看下scores赋值的代码,可以发现是因为iter的使用,查下rust的iter相关文档:https://doc.rust-lang.org/std/iter/index.html,可以看到这样的说明:
那么如何修改代码通过编译呢,一种方法是采用into_iter替代iter:
最后要解释的是into_iter的所有会发生转移,也就是说keys和values中的String及整型数值的所有权都会移入到scores中,相当于keys和values都被消耗掉。
into_iter