move_semantics2 solution

This commit is contained in:
mo8it 2024-06-21 17:02:50 +02:00
parent 946c29679e
commit 68142aff7f
3 changed files with 35 additions and 14 deletions

View file

@ -1,5 +1,3 @@
// Make the test pass by finding a way to keep both Vecs separate!
fn fill_vec(vec: Vec<i32>) -> Vec<i32> { fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
let mut vec = vec; let mut vec = vec;
@ -16,13 +14,15 @@ fn main() {
mod tests { mod tests {
use super::*; use super::*;
// TODO: Make both vectors `vec0` and `vec1` accessible at the same time to
// fix the compiler error in the test.
#[test] #[test]
fn move_semantics2() { fn move_semantics2() {
let vec0 = vec![22, 44, 66]; let vec0 = vec![22, 44, 66];
let vec1 = fill_vec(vec0); let vec1 = fill_vec(vec0);
assert_eq!(vec0, vec![22, 44, 66]); assert_eq!(vec0, [22, 44, 66]);
assert_eq!(vec1, vec![22, 44, 66, 88]); assert_eq!(vec1, [22, 44, 66, 88]);
} }
} }

View file

@ -352,16 +352,10 @@ When running this exercise for the first time, you'll notice an error about
"borrow of moved value". In Rust, when an argument is passed to a function and "borrow of moved value". In Rust, when an argument is passed to a function and
it's not explicitly returned, you can't use the original variable anymore. it's not explicitly returned, you can't use the original variable anymore.
We call this "moving" a variable. When we pass `vec0` into `fill_vec`, it's We call this "moving" a variable. When we pass `vec0` into `fill_vec`, it's
being "moved" into `vec1`, meaning we can't access `vec0` anymore after the being "moved" into `vec1`, meaning we can't access `vec0` anymore.
fact.
Rust provides a couple of different ways to mitigate this issue, feel free to You could make another, separate version of the data that's in `vec0` and
try them all: pass it to `fill_vec` instead.
1. You could make another, separate version of the data that's in `vec0` and
pass that to `fill_vec` instead.
2. Make `fill_vec` borrow its argument instead of taking ownership of it,
and then copy the data within the function (`vec.clone()`) in order to
return an owned `Vec<i32>`.
""" """
[[exercises]] [[exercises]]

View file

@ -1 +1,28 @@
// Solutions will be available before the stable release. Thank you for testing the beta version 🥰 fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
let mut vec = vec;
vec.push(88);
vec
}
fn main() {
// You can optionally experiment here.
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn move_semantics2() {
let vec0 = vec![22, 44, 66];
// Cloning `vec0` so that the clone is moved into `fill_vec`, not `vec0`
// itself.
let vec1 = fill_vec(vec0.clone());
assert_eq!(vec0, [22, 44, 66]);
assert_eq!(vec1, [22, 44, 66, 88]);
}
}