Rust Can';在不可变切片可以使用的情况下,不要使用可变切片

Rust Can';在不可变切片可以使用的情况下,不要使用可变切片,rust,Rust,我想创建一个包含一个切片的结构,并可以返回对该切片中项目的引用。到目前为止,我已经能够做到这一点: pub struct Stride<'a> { items: &'a [f32], } impl<'a> Iterator for Stride<'a> { type Item = &'a f32; fn next(&mut self) -> Option<&'a f32> {

我想创建一个包含一个切片的结构,并可以返回对该切片中项目的引用。到目前为止,我已经能够做到这一点:

pub struct Stride<'a> {
    items: &'a [f32],
}

impl<'a> Iterator for Stride<'a> {
    type Item = &'a f32;
    fn next(&mut self) -> Option<&'a f32> {
        Some(&self.items[0])
    }
}
pub结构{
类型项目=&'a f32;
fn下一步(&mut self)->选项{
项目:&'a mut[f32],
}
恳求{
类型项目=&'a f32;
fn下一步(&mut self)->选项{
8 | |部分(&self.items[0])
9 | |     }
| |_____^
注意:…这样引用就不会超过借用的内容
-->src/lib.rs:8:15
|
8 |部分(&self.items[0])
|               ^^^^^^^^^^
注意:但是,生存期必须对impl上定义的5:6的生存期“a”有效。。。
-->src/lib.rs:5:6
|
5 | impl{
|      ^^
=注意:…因此表达式是可赋值的:

预期的std::option::option实际上,您要做的是创建可变引用的迭代器


总结是Rust无法判断您是否不止一次返回同一可变引用。如果您这样做,则会出现别名,这会破坏Rust的规则。另外,所示的迭代器是不安全的,因为它总是返回第一项!作为比Rust更聪明的人,您必须手动验证您没有违反安全规则,然后使用
unsafe
代码忽略警告。通常会使用类似
mem::transmute
的内容。

我假设您问这个问题是为了探索如何实现它。如果您想在现实世界中这样做,您可以使用标准库。
pub struct Stride<'a> {
    items: &'a mut [f32],
}

impl<'a> Iterator for Stride<'a> {
    type Item = &'a f32;
    fn next(&mut self) -> Option<&'a f32> {
        Some(&self.items[0])
    }
}