From 1bb500d1433290b0cc95ac58ce93a30cf8cd2ec0 Mon Sep 17 00:00:00 2001
From: Vandewaeter Fabio <fabio.vandewaeter.etu@univ-lille.fr>
Date: Mon, 10 Mar 2025 16:35:27 +0100
Subject: [PATCH] TP2 exercice 2

---
 tp2/README.md               | 52 +++++++++++++++++++++++++++++++++++++
 tp2/src/exercice2/types1.rs | 16 ++++++++++++
 tp2/src/exercice2/types2.rs | 29 +++++++++++++++++++++
 3 files changed, 97 insertions(+)
 create mode 100644 tp2/src/exercice2/types1.rs
 create mode 100644 tp2/src/exercice2/types2.rs

diff --git a/tp2/README.md b/tp2/README.md
index b52cefe..c794327 100644
--- a/tp2/README.md
+++ b/tp2/README.md
@@ -279,11 +279,63 @@ fn main() {
 
 ## 2.3. Lifetimes on types
 ### 2.3.1. Types 1
+
+On ajoute un lifetime au type `Message` pour son attribut `content` qui est une référence car le type `Message` a besoin que la référence de `content` soit valide encore valide pour être utilisé :
+
 ```rs
+struct Message<'a> {
+    content: &'a str,
+}
+
+impl<'a> Message<'a> {
+    fn from(s: &str) -> Message {
+        Message {
+            content: s
+        }
+    }
+}
+fn main() {
+    let s = String::from("Hello");
+    let m = Message::from(&s);
+    println!("{}", m.content);
+}
 ```
 
 ### 2.3.2. Types 2
+
+On ajoute le lifetime `'a` au type `Node` car il a une référence vers un autre `Node` :
+
 ```rs
+struct Node<'a> {
+    value: i32,
+    next: Option<&'a Node<'a>>
+}
+
+impl<'a> Node<'a> {
+    fn new(value: i32) -> Node<'a> {
+        Node { value, next: None }
+    }
+    fn push(&mut self, node: &'a Node<'a>) {
+        self.next = Some(node);
+    }
+    fn print(&self) {
+        println!("{}", self.value);
+        if let Some(n) = self.next {
+            n.print()
+        }
+    }
+}
+
+fn main() {
+    let mut node1 = Node::new(1);
+    let mut node2 = Node::new(2);
+    let node3 = Node::new(3);
+
+    node2.push(&node3);
+    node1.push(&node2);
+    node1.print();
+}
+
 ```
 
 # 3. Long exercise : a mini web server
diff --git a/tp2/src/exercice2/types1.rs b/tp2/src/exercice2/types1.rs
new file mode 100644
index 0000000..3f2d25c
--- /dev/null
+++ b/tp2/src/exercice2/types1.rs
@@ -0,0 +1,16 @@
+struct Message<'a> {
+    content: &'a str,
+}
+
+impl<'a> Message<'a> {
+    fn from(s: &str) -> Message {
+        Message {
+            content: s
+        }
+    }
+}
+fn main() {
+    let s = String::from("Hello");
+    let m = Message::from(&s);
+    println!("{}", m.content);
+}
diff --git a/tp2/src/exercice2/types2.rs b/tp2/src/exercice2/types2.rs
new file mode 100644
index 0000000..b5b71d2
--- /dev/null
+++ b/tp2/src/exercice2/types2.rs
@@ -0,0 +1,29 @@
+struct Node<'a> {
+    value: i32,
+    next: Option<&'a Node<'a>>
+}
+
+impl<'a> Node<'a> {
+    fn new(value: i32) -> Node<'a> {
+        Node { value, next: None }
+    }
+    fn push(&mut self, node: &'a Node<'a>) {
+        self.next = Some(node);
+    }
+    fn print(&self) {
+        println!("{}", self.value);
+        if let Some(n) = self.next {
+            n.print()
+        }
+    }
+}
+
+fn main() {
+    let mut node1 = Node::new(1);
+    let mut node2 = Node::new(2);
+    let node3 = Node::new(3);
+
+    node2.push(&node3);
+    node1.push(&node2);
+    node1.print();
+}
-- 
GitLab