diff options
| author | Hunter Kvalevog <hunter@kvog.sh> | 2026-09-27 16:27:24 -0500 |
|---|---|---|
| committer | Hunter Kvalevog <hunter@kvog.sh> | 2026-09-27 16:27:24 -0500 |
| commit | b4f5f3bc39fb2187c042ad2fa514e51d1261b4d1 (patch) | |
| tree | 5840da24e0b8f9982e431494892288f2ddce11be | |
| parent | e7c14ea67e4a39789e7c1dd3a264c61a9c14050e (diff) | |
rustlings: complete 16
| -rw-r--r-- | rustlings/.rustlings-state.txt | 7 | ||||
| -rw-r--r-- | rustlings/exercises/16_lifetimes/lifetimes1.rs | 2 | ||||
| -rw-r--r-- | rustlings/exercises/16_lifetimes/lifetimes2.rs | 2 | ||||
| -rw-r--r-- | rustlings/exercises/16_lifetimes/lifetimes3.rs | 6 | ||||
| -rw-r--r-- | rustlings/solutions/16_lifetimes/lifetimes1.rs | 24 | ||||
| -rw-r--r-- | rustlings/solutions/16_lifetimes/lifetimes2.rs | 29 | ||||
| -rw-r--r-- | rustlings/solutions/16_lifetimes/lifetimes3.rs | 18 |
7 files changed, 75 insertions, 13 deletions
diff --git a/rustlings/.rustlings-state.txt b/rustlings/.rustlings-state.txt index 888d577..e366df4 100644 --- a/rustlings/.rustlings-state.txt +++ b/rustlings/.rustlings-state.txt @@ -1,6 +1,6 @@ DON'T EDIT THIS FILE! -lifetimes1 +tests1 intro1 intro2 @@ -65,4 +65,7 @@ traits2 traits3 traits4 traits5 -quiz3
\ No newline at end of file +quiz3 +lifetimes1 +lifetimes2 +lifetimes3
\ No newline at end of file diff --git a/rustlings/exercises/16_lifetimes/lifetimes1.rs b/rustlings/exercises/16_lifetimes/lifetimes1.rs index 19e2d39..683bd75 100644 --- a/rustlings/exercises/16_lifetimes/lifetimes1.rs +++ b/rustlings/exercises/16_lifetimes/lifetimes1.rs @@ -4,7 +4,7 @@ // not own their own data. What if their owner goes out of scope? // TODO: Fix the compiler error by updating the function signature. -fn longest(x: &str, y: &str) -> &str { +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { diff --git a/rustlings/exercises/16_lifetimes/lifetimes2.rs b/rustlings/exercises/16_lifetimes/lifetimes2.rs index de5a5df..ebbc99c 100644 --- a/rustlings/exercises/16_lifetimes/lifetimes2.rs +++ b/rustlings/exercises/16_lifetimes/lifetimes2.rs @@ -11,9 +11,9 @@ fn main() { // TODO: Fix the compiler error by moving one line. let string1 = String::from("long string is long"); + let string2 = String::from("xyz"); let result; { - let string2 = String::from("xyz"); result = longest(&string1, &string2); } println!("The longest string is '{result}'"); diff --git a/rustlings/exercises/16_lifetimes/lifetimes3.rs b/rustlings/exercises/16_lifetimes/lifetimes3.rs index 1cc2759..91e3922 100644 --- a/rustlings/exercises/16_lifetimes/lifetimes3.rs +++ b/rustlings/exercises/16_lifetimes/lifetimes3.rs @@ -1,9 +1,9 @@ // Lifetimes are also needed when structs hold references. // TODO: Fix the compiler errors about the struct. -struct Book { - author: &str, - title: &str, +struct Book<'a> { + author: &'a str, + title: &'a str, } fn main() { diff --git a/rustlings/solutions/16_lifetimes/lifetimes1.rs b/rustlings/solutions/16_lifetimes/lifetimes1.rs index dcf2377..4f56834 100644 --- a/rustlings/solutions/16_lifetimes/lifetimes1.rs +++ b/rustlings/solutions/16_lifetimes/lifetimes1.rs @@ -1,4 +1,24 @@ +// The Rust compiler needs to know how to check whether supplied references are +// valid, so that it can let the programmer know if a reference is at risk of +// going out of scope before it is used. Remember, references are borrows and do +// not own their own data. What if their owner goes out of scope? + +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + // ^^^^ ^^ ^^ ^^ + if x.len() > y.len() { x } else { y } +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_longest() { + assert_eq!(longest("abcd", "123"), "abcd"); + assert_eq!(longest("abc", "1234"), "1234"); + } } diff --git a/rustlings/solutions/16_lifetimes/lifetimes2.rs b/rustlings/solutions/16_lifetimes/lifetimes2.rs index dcf2377..3ca4909 100644 --- a/rustlings/solutions/16_lifetimes/lifetimes2.rs +++ b/rustlings/solutions/16_lifetimes/lifetimes2.rs @@ -1,4 +1,29 @@ +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + if x.len() > y.len() { x } else { y } +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + let string1 = String::from("long string is long"); + // Solution1: You can move `strings2` out of the inner block so that it is + // not dropped before the print statement. + let string2 = String::from("xyz"); + let result; + { + result = longest(&string1, &string2); + } + println!("The longest string is '{result}'"); + // `string2` dropped at the end of the function. + + // ========================================================================= + + let string1 = String::from("long string is long"); + let result; + { + let string2 = String::from("xyz"); + result = longest(&string1, &string2); + // Solution2: You can move the print statement into the inner block so + // that it is executed before `string2` is dropped. + println!("The longest string is '{result}'"); + // `string2` dropped here (end of the inner scope). + } } diff --git a/rustlings/solutions/16_lifetimes/lifetimes3.rs b/rustlings/solutions/16_lifetimes/lifetimes3.rs index dcf2377..16a5a68 100644 --- a/rustlings/solutions/16_lifetimes/lifetimes3.rs +++ b/rustlings/solutions/16_lifetimes/lifetimes3.rs @@ -1,4 +1,18 @@ +// Lifetimes are also needed when structs hold references. + +struct Book<'a> { + // ^^^^ added a lifetime annotation + author: &'a str, + // ^^ + title: &'a str, + // ^^ +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + let book = Book { + author: "George Orwell", + title: "1984", + }; + + println!("{} by {}", book.title, book.author); } |