2017-12-14 20 views
2

내가 Borrow-check error with variable not living long enough in nested lambda에 비슷한 상황에 붙어있어하지만 내 상황이 다른 방법을 알아낼 수 없습니다입니다 :사용 flat_map는 VEC에 VEC <u8>를 변환하는 <char>

error[E0597]: `s` does not live long enough 
--> src/main.rs:6:35 
    | 
6 |    .flat_map(|s| s.chars()) 
    |       -  ^`s` dropped here while still borrowed 
    |       | 
    |       borrow occurs here 
7 |    .collect::<Vec<_>>() 
    |        - borrowed value needs to live until here 
: 오류를 제공

let mut vec = vec![vec![0u8, 1u8], vec![2u8, 3u8], vec![4u8, 5u8]]; 
vec.iter().map(|row| { 
    row.iter() 
     .map(|d| format!("{:04b}", d)) 
     .flat_map(|s| s.chars()) 
     .collect::<Vec<_>>() 
}); 

새로운 Vec을 작성하여 추가 작업을 수행했지만 첫 번째 방법이 효과가 없었던 이유가 확실하지 않습니다.

let mut tmp = vec![]; 
vec.iter() 
    .map(|d| format!("{:04b}", d)) 
    .for_each(|s| {tmp.append(&mut s.chars().collect::<Vec<_>>());}); 
+0

'chars()'를 호출하면's'를 빌려서 참조를 담는'Char' 구조체를 만듭니다. 클로저를 종료하면 s가 삭제되므로 'Char'가 무효화됩니다. – Boiethios

+0

@Boiethios 이것은 [documentation] (https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flat_map)이하는 정확한 방법입니다. 왜 그곳에서 작동하고 여기에서 작동하지 않습니까? – Andrew

+1

@Andrew이 예제에서는 정적 문자열을 사용합니다. 귀하의 예제에서 문자열은 iterator 내에서 만들어 지므로 충분히 길지 않습니다. –

답변

2

먼저 자신의 데이터를 소유 String들, 항복, 당신의 반복자를 통해 폐쇄 |d| format!("{:04b}", d)지도, 그래서 이것은 완벽하게 찾을 작동합니다. 다음 단계의 flat_map()은 각 String.chars()을 호출합니다. 이것은 String을 암시 적으로 &str으로 derefrences하고이 차용을 참조하는 Chars 반복자를 작성합니다. 그러나 이제 우리에게는 문제가 있습니다. 아무도 우리가 더 이상 빌린 String을 소유하고 있지 않습니다.

let mut vec = vec![vec![0u8, 1u8], vec![2u8, 3u8], vec![4u8, 5u8]]; 
vec.iter().map(|row| { 
    let strings: Vec<_> = row 
     .iter() 
     .map(|d| format!("{:04b}", d)) 
     .collect(); 
    strings 
     .iter() 
     .flat_map(|s| s.chars()) 
     .collect::<Vec<_>>() 
}); 

이제 우리는 중간 String들에 대한 소유자가, 모든 것이 다시 잘 작동 :

한 가지 해결 방법은 String의의 임시 벡터를 저장하는 것입니다.

+0

이런 종류의 상용구를 막기 위해'String'을위한'chars'의 소비 버전이 있어야 할 것입니다. – Boiethios

+0

@Boiethios : 어제 나는 그저 "FromIterator"구현을 찾을 수 없다는 것을 알고 놀랐다. –

+0

@MatthieuM. 하찮은 것 같습니다. 이 추가로 인해 변경 내용이 변경되지 않으면 누군가 (당신? 나?)가 뭔가 제안해야합니다. – Boiethios