2017-04-05 2 views
0

코드 값을 변경하는 방법 :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 이후

+1

스타일에 대한 또 다른 메모 : 오히려 해시 맵에 대한 명시 적 유형 주석을 생략하십시오. 컴파일러는 보통 완벽하게 타입을 알아낼 수 있습니다 ;-) 또한 for 루프에서 직접'iter_mut()'(그리고'iter()')를 사용하는 대신 보통 for ... in & mut map { ...}'. :) –

+0

조언 해 주셔서 감사합니다. 두 번째 방법이 유용합니다. 그러나 처음에'let mut map : BTreeMap = BTreeMap :: new();'을 썼지 만 오류 : [오류 [E0243] : 유형 인수의 개수가 잘못 : 예상 2, 발견 0 '이 나타났습니다. 그래서 타입 이름을 쓰려고 바꿨습니다 ... 사용법을 말해 줄 수 있습니까? – wind2412

+0

'let mut map = BTreeMap :: new()';-) –

답변

1

그냥 역 참조 (iter_mut() 인해) 변경 가능한 기준이다.

+0

대단히 고마워요! – wind2412