I am trying to return the values of a vector with the following code and. I am getting the error message.
fn merge<'a>(left: &'a [i32], right: &'a [i32]) -> [i32] {
let mut merged: Vec<i32> = Vec::new();
// push elements to merged
*merged
}
test.rs:19:52: 19:57 error: the trait
core::marker::Sized
is not implemented for the type[i32]
test.rs:19 fn merge<'a>(left: &'a [i32], right: &'a [i32]) -> [i32] {
And I can't for the life of me find out how I fix this
The compiler is telling you that it is impossible to return a
[T]
.Rust has owned vectors (
Vec<T>
), slices (&[T]
) and fixed-size arrays ([T; n]
, wheren
is a non-negative integer like6
).A slice is composed of a pointer to data and a length. This is what your
left
andright
values are. However, what isn't specified in a slice is who ultimately owns the data. Slices just borrow data from something else. You can treat the&
as a signal that the data is borrowed.A
Vec
is one thing that owns data and can let other things borrow it via a slice. For your problem, you need to allocate some memory to store the values, andVec
does that for you. You can then return the entireVec
, transferring ownership to the caller.The specific error message means that the compiler doesn't know how much space to allocate for the type
[i32]
, because it's never meant to be allocated directly. You'll see this error for other things in Rust, usually when you try to dereference a trait object, but that's distinctly different from the case here.Here's the most likely fix you want:
Additionally, you don't need to specify lifetimes here, and I removed the redundant type annotation on your
merged
declaration.