소스 검색

Persistent Stack--Drop

runningwater 2 년 전
부모
커밋
9a1d1af8fa
2개의 변경된 파일14개의 추가작업 그리고 0개의 파일을 삭제
  1. 2 0
      .gitignore
  2. 12 0
      src/third.rs

+ 2 - 0
.gitignore

@@ -1 +1,3 @@
 /target
 /target
+/.idea
+/.dist

+ 12 - 0
src/third.rs

@@ -30,6 +30,18 @@ impl<T> List<T> {
         self.head.as_ref().map(|node| &node.elem)
         self.head.as_ref().map(|node| &node.elem)
     }
     }
 }
 }
+impl<T> Drop for List<T> {
+    fn drop(&mut self) {
+        let mut head = self.head.take();
+        while let Some(node) = head {
+            if let Ok(mut node) = Rc::try_unwrap(node) {
+                head = node.next.take();
+            } else {
+                break;
+            }
+        }
+    }
+}
 pub struct Iter<'a, T> {
 pub struct Iter<'a, T> {
     next: Option<&'a Node<T>>,
     next: Option<&'a Node<T>>,
 }
 }