values in a scope are dropped in the opposite order they are defined

Too Many Linked Lists 에서 ch03인 persistent list의 Drop 트레이트를 구현하자 오류가 나지 않았던 테스트 코드에서 변수 수명 에러가 나타났다.

#[test]
fn iter() {
    let mut list = List::new();
    let queue = "Hello, world!".chars().collect::<Vec<_>>();
    queue.iter().for_each(|c| { // queue does not live long enough
        list = list.prepend(c);
    });
    let answer_iter = queue.iter().rev();
    let list_iter = list.iter();
    assert!(list_iter
        .zip(answer_iter)
        .all(|(&list, answer)| list == answer));
}

그 말은 즉슨, queue에 의존하는 listqueue가 드롭이 된 뒤에도 살아있기 때문에 발생한 문제인 것이었다. drop은 별도로 명시하지 않는 한 블럭의 마지막에 가서 일어날 것이고, drop은 정의된 반대 순서로 진행되기 때문에 listqueue 보다 먼저 정의한 이 코드에 따라서 컴파일러는 queue를 먼저 삭제하려고 할 것이고, 이로 인해 변수 수명 이슈가 발생한 것이다!!!

수정은 매우 EZ하다. 단지 queue정의문을 list 보다 위에 써주면 해결된다.

   error[E0597]: `queue` does not live long enough
   --> too_many_linked_lists/src/ch03_persistent_stack.rs:124:9
    |
124 |         queue.iter().for_each(|c| {
    |         ^^^^^^^^^^^^ borrowed value does not live long enough
...
134 |     }
    |     -
    |     |
    |     `queue` dropped here while still borrowed
    |     borrow might be used here, when `list` is dropped and runs the `Drop` code for type `ch03_persistent_stack::List`
    |
    = note: values in a scope are dropped in the opposite order they are defined