diff --git a/tp2/README.md b/tp2/README.md index b52cefe6aa90c89f12ebd937bb760a7612002f61..c7943276eea6f1250c88ab74c5bde76ce835e176 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 0000000000000000000000000000000000000000..3f2d25c129e19296e81d7c698edbbbd4dd546b83 --- /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 0000000000000000000000000000000000000000..b5b71d2a520d4a338b7dbbb050e80b131fc2314d --- /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(); +}