내가 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<_>>());});
'chars()'를 호출하면's'를 빌려서 참조를 담는'Char' 구조체를 만듭니다. 클로저를 종료하면 s가 삭제되므로 'Char'가 무효화됩니다. – Boiethios
@Boiethios 이것은 [documentation] (https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flat_map)이하는 정확한 방법입니다. 왜 그곳에서 작동하고 여기에서 작동하지 않습니까? – Andrew
@Andrew이 예제에서는 정적 문자열을 사용합니다. 귀하의 예제에서 문자열은 iterator 내에서 만들어 지므로 충분히 길지 않습니다. –