summaryrefslogtreecommitdiff
path: root/rustlings/exercises/16_lifetimes
diff options
context:
space:
mode:
Diffstat (limited to 'rustlings/exercises/16_lifetimes')
-rw-r--r--rustlings/exercises/16_lifetimes/README.md22
-rw-r--r--rustlings/exercises/16_lifetimes/lifetimes1.rs28
-rw-r--r--rustlings/exercises/16_lifetimes/lifetimes2.rs20
-rw-r--r--rustlings/exercises/16_lifetimes/lifetimes3.rs16
4 files changed, 86 insertions, 0 deletions
diff --git a/rustlings/exercises/16_lifetimes/README.md b/rustlings/exercises/16_lifetimes/README.md
new file mode 100644
index 0000000..91373f7
--- /dev/null
+++ b/rustlings/exercises/16_lifetimes/README.md
@@ -0,0 +1,22 @@
+# Lifetimes
+
+Lifetimes tell the compiler how to check whether references live long
+enough to be valid in any given situation. For example lifetimes say
+"make sure parameter 'a' lives as long as parameter 'b' so that the return
+value is valid".
+
+They are only necessary on borrows, i.e. references,
+since copied parameters or moves are owned in their scope and cannot
+be referenced outside. Lifetimes mean that calling code of e.g. functions
+can be checked to make sure their arguments are valid. Lifetimes are
+restrictive of their callers.
+
+If you'd like to learn more about lifetime annotations, the
+[lifetimekata](https://tfpk.github.io/lifetimekata/) project
+has a similar style of exercises to Rustlings, but is all about
+learning to write lifetime annotations.
+
+## Further information
+
+- [Lifetimes (in Rust By Example)](https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime.html)
+- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)
diff --git a/rustlings/exercises/16_lifetimes/lifetimes1.rs b/rustlings/exercises/16_lifetimes/lifetimes1.rs
new file mode 100644
index 0000000..19e2d39
--- /dev/null
+++ b/rustlings/exercises/16_lifetimes/lifetimes1.rs
@@ -0,0 +1,28 @@
+// 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?
+
+// TODO: Fix the compiler error by updating the function signature.
+fn longest(x: &str, y: &str) -> &str {
+ if x.len() > y.len() {
+ x
+ } else {
+ y
+ }
+}
+
+fn main() {
+ // 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/exercises/16_lifetimes/lifetimes2.rs b/rustlings/exercises/16_lifetimes/lifetimes2.rs
new file mode 100644
index 0000000..de5a5df
--- /dev/null
+++ b/rustlings/exercises/16_lifetimes/lifetimes2.rs
@@ -0,0 +1,20 @@
+// Don't change this function.
+fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
+ if x.len() > y.len() {
+ x
+ } else {
+ y
+ }
+}
+
+fn main() {
+ // TODO: Fix the compiler error by moving one line.
+
+ let string1 = String::from("long string is long");
+ 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
new file mode 100644
index 0000000..1cc2759
--- /dev/null
+++ b/rustlings/exercises/16_lifetimes/lifetimes3.rs
@@ -0,0 +1,16 @@
+// Lifetimes are also needed when structs hold references.
+
+// TODO: Fix the compiler errors about the struct.
+struct Book {
+ author: &str,
+ title: &str,
+}
+
+fn main() {
+ let book = Book {
+ author: "George Orwell",
+ title: "1984",
+ };
+
+ println!("{} by {}", book.title, book.author);
+}