< 返回版块

Zac.R 发表于 2021-04-29 07:55

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);

}

评论区

写评论
作者 Zac.R 2021-04-29 13:41

所以说由iter()创建的HashMap里面全放的是引用,而into_iter()才是放的值!/(ㄒoㄒ)/~~

modraedlau 2021-04-29 13:34

你中间注射那两行不行的原因是因为你创建了临时值,而没有绑定到任何变量上,也就是没有其所有权。编译器会任何此临时值生命周期也是“临时”的,也就是方法执行完就被销毁。

scores.insert(&String::from("blue"), &50);

String::from("blue")在insert后就会被销毁掉,但是scores要在main方法结束时销毁,那么在scores销毁之前如果上面的语法是正确的那就会出现悬垂指针。 所以在rust中,我们如果这么写(将值绑定到变量上):

let key = String::from("blue");
let value = 50;
scores.insert(&key, &value);

可以保证key和value的能“活”到main结束。 这两种写法在rust中是完全不一样的,所以从其他语言刚过来要仔细体会下。

--
👇
Zac.R: ```rust 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);

let key = "Olive".to_string();
let value = 60;

scores.insert(&key,&value);

println!("{:#?}",scores);

}

谢谢,使用into_iter(),可以解决问题,并且使用into_iter()后注释掉的两行去掉&引用能运行,不知道怎么从原理上理解,感觉建立的scores还是那个score啊?!!!
使用下面的scores.insert(&key,&value);能够成功添加,但是上面注释掉的两行就不行,应该是关于生命周期的问题,如果要像上面那样,可以怎样改写呢?


--  
👇  
modraedlau: 
首先,Rust编译器是我们很好的朋友,编译器对编译错误的相关诠释是比较贴心的。我们来看看编译错误提示: 

error[E0308]: mismatched types --> src/main.rs:11:19 | 11 | scores.insert(String::from("blue"), 50usize); | ^^^^^^^^^^^^^^^^^^^^ | | | expected &String, found struct String | 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}, found usize | help: consider borrowing here: &50usize


这说明最后的scores的类型是HashMap<&String, &usize>的类型(注:usize为默认的integer类型)。 仔细看下scores赋值的代码,可以发现是因为iter的使用,查下rust的iter相关文档:https://doc.rust-lang.org/std/iter/index.html,可以看到这样的说明: 

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.


那么如何修改代码通过编译呢,一种方法是采用into_iter替代iter: 

let mut scores:HashMap<_,_> = keys.into_iter().zip(values.into_iter()).collect();


最后要解释的是into_iter的所有会发生转移,也就是说keys和values中的String及整型数值的所有权都会移入到scores中,相当于keys和values都被消耗掉。

作者 Zac.R 2021-04-29 12:59
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);

    let key = "Olive".to_string();
    let value = 60;

    scores.insert(&key,&value);

    println!("{:#?}",scores);
}

谢谢,使用into_iter(),可以解决问题,并且使用into_iter()后注释掉的两行去掉&引用能运行,不知道怎么从原理上理解,感觉建立的scores还是那个score啊?!!! 使用下面的scores.insert(&key,&value);能够成功添加,但是上面注释掉的两行就不行,应该是关于生命周期的问题,如果要像上面那样,可以怎样改写呢?

--
👇
modraedlau: 首先,Rust编译器是我们很好的朋友,编译器对编译错误的相关诠释是比较贴心的。我们来看看编译错误提示:

error[E0308]: mismatched types
  --> src/main.rs:11:19
   |
11 |     scores.insert(String::from("blue"), 50usize);
   |                   ^^^^^^^^^^^^^^^^^^^^
   |                   |
   |                   expected `&String`, found struct `String`
   |                   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}`, found `usize`
   |                                         help: consider borrowing here: `&50usize`

这说明最后的scores的类型是HashMap<&String, &usize>的类型(注:usize为默认的integer类型)。 仔细看下scores赋值的代码,可以发现是因为iter的使用,查下rust的iter相关文档:https://doc.rust-lang.org/std/iter/index.html,可以看到这样的说明:

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.

那么如何修改代码通过编译呢,一种方法是采用into_iter替代iter:

let mut scores:HashMap<_,_> = keys.into_iter().zip(values.into_iter()).collect();

最后要解释的是into_iter的所有会发生转移,也就是说keys和values中的String及整型数值的所有权都会移入到scores中,相当于keys和values都被消耗掉。

modraedlau 2021-04-29 09:03

首先,Rust编译器是我们很好的朋友,编译器对编译错误的相关诠释是比较贴心的。我们来看看编译错误提示:

error[E0308]: mismatched types
  --> src/main.rs:11:19
   |
11 |     scores.insert(String::from("blue"), 50usize);
   |                   ^^^^^^^^^^^^^^^^^^^^
   |                   |
   |                   expected `&String`, found struct `String`
   |                   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}`, found `usize`
   |                                         help: consider borrowing here: `&50usize`

这说明最后的scores的类型是HashMap<&String, &usize>的类型(注:usize为默认的integer类型)。 仔细看下scores赋值的代码,可以发现是因为iter的使用,查下rust的iter相关文档:https://doc.rust-lang.org/std/iter/index.html,可以看到这样的说明:

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.

那么如何修改代码通过编译呢,一种方法是采用into_iter替代iter:

let mut scores:HashMap<_,_> = keys.into_iter().zip(values.into_iter()).collect();

最后要解释的是into_iter的所有会发生转移,也就是说keys和values中的String及整型数值的所有权都会移入到scores中,相当于keys和values都被消耗掉。

gwy15 2021-04-29 08:41

into_iter

1 共 5 条评论, 1 页