Why does the following Rust code give an error?
fn getVecSlice(vec: &Vec<f64>, start: i32, len: i32) -> &[f64] {
vec[start..start + len]
}
The error message I get is
the trait `core::ops::Index<core::ops::Range<i32>>` is not implemented for the type `collections::vec::Vec<f64>` [E0277]
In later versions of Rust, I get
error[E0277]: the trait bound `std::ops::Range<i32>: std::slice::SliceIndex<[f64]>` is not satisfied
--> src/main.rs:2:9
|
2 | vec[start..start + len]
| ^^^^^^^^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[f64]>` is not implemented for `std::ops::Range<i32>`
= note: required because of the requirements on the impl of `std::ops::Index<std::ops::Range<i32>>` for `std::vec::Vec<f64>`
I'm trying to simulate a 2 dimensional matrix using the Vec
type and return references to the different rows of the matrix.What is the best way to achieve this?
The error messages tells you that you can't index into a vector with values of type u32
. Vec
indices have to be of type usize
, so you have to cast your indices to that type like this:
vec[start as usize..(start + len) as usize]
or just change the type of the start
and len
arguments to usize
.
You also need to take a reference to the result:
&vec[start as usize..(start + len) as usize]
Why do we need usize:
usize
gives you the guarantee to be always big enough to hold any pointer or any offset in a data structure, while u32
can be too small on some architectures.
As an example, on a 32 bit x86 computer, usize = u32
, while on x86_64 computers, usize = u64
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With