코드 값을 변경하는 방법 :BTreeMap 컨테이너에
#[derive(Debug)]
struct Haha {
data: i32,
}
use std::collections::BTreeMap;
fn main() {
let mut map: BTreeMap<i8, Option<Box<Haha>>> = BTreeMap::new();
map.insert(1, Some(Box::new(Haha { data: 3 })));
map.insert(2, None);
for (key, value) in map.iter_mut() {
if value.is_none() { // if find `None`, change it to a `Some(Haha)`
value = Some(Box::new(Haha { data: 5 }));
}
}
}
내가 BTreeMap.value
의 값 None
을 얻을 때, 나는 Some
값이 아닌 참조로 변경하는 기능을 만들고 싶어. 그러나 실수을 제공 : map.iter_mut()
를 사용하여 난 단지 참조를 얻을 수 있습니다
error[E0308]: mismatched types
--> Untitled.rs:15:12
|
15 | value = Some(Box::new(Haha{data: 5}));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected mutable reference, found enum `std::option::Option`
|
= note: expected type `&mut std::option::Option<std::boxed::Box<Haha>>`
found type `std::option::Option<std::boxed::Box<Haha>>`
= help: here are some functions which might fulfill your needs:
- .unwrap()
때문입니다. true 값을 보내는 방법 Some(Haha)
그러나 mut 참조에 대한 참조가 아닙니다 value
? value = & mut Some(Box::new(Haha { data: 5 }));
으로 변경하면 Some(Box...)
이 파괴되어 다른 실수가 나옵니다.
*value = Some(Box::new(Haha{data: 5}));
그리고 훌륭하게 작동 : value
이후
스타일에 대한 또 다른 메모 : 오히려 해시 맵에 대한 명시 적 유형 주석을 생략하십시오. 컴파일러는 보통 완벽하게 타입을 알아낼 수 있습니다 ;-) 또한 for 루프에서 직접'iter_mut()'(그리고'iter()')를 사용하는 대신 보통 for ... in & mut map { ...}'. :) –
조언 해 주셔서 감사합니다. 두 번째 방법이 유용합니다. 그러나 처음에'let mut map : BTreeMap = BTreeMap :: new();'을 썼지 만 오류 : [오류 [E0243] : 유형 인수의 개수가 잘못 : 예상 2, 발견 0 '이 나타났습니다. 그래서 타입 이름을 쓰려고 바꿨습니다 ... 사용법을 말해 줄 수 있습니까? – wind2412
'let mut map = BTreeMap :: new()';-) –