Rust 对自身进行引用的生成迭代器

Rust 对自身进行引用的生成迭代器,rust,Rust,对于第17天代码的出现(问题陈述不是特别重要),我想做的是有一个类型: #[派生(调试、克隆)] 结构立方体{ 活动:哈希集, } 并创建一个迭代器,生成该类型的连续实例。我可以(确实)实现这一点: 多维数据集的impl迭代器{ 类型项=立方体; fn next(&mut self)->选项{…} } 它工作得很好,但是非常昂贵,因为我最终要做的是在本地修改多维数据集,并返回它的副本 我想做的是让迭代器改变它的内部状态,并向它发出一个引用,这样我就不需要进行任何复制 即使是在最简单的情况下,

对于第17天代码的出现(问题陈述不是特别重要),我想做的是有一个类型:

#[派生(调试、克隆)]
结构立方体{
活动:哈希集,
}
并创建一个
迭代器
,生成该类型的连续实例。我可以(确实)实现这一点:

多维数据集的impl迭代器{ 类型项=立方体; fn next(&mut self)->选项{…} } 它工作得很好,但是非常昂贵,因为我最终要做的是在本地修改
多维数据集
,并返回它的副本

我想做的是让
迭代器
改变它的内部状态,并向它发出一个引用,这样我就不需要进行任何复制

即使是在最简单的情况下,比如一个无限迭代器,它只是发出一个引用,我也不能想出一个公式来检查:

//这实际上并没有编译
fn iter(cc:&mut Cubes)->impl迭代器{
标准:国际热核聚变实验堆:从||{
一些(&*cc)
})
}
然而,我所做的大致相当于此(它可以编译,但我正在努力改进):

fn iter(cc:ConwayCubes)->impl迭代器{
标准:国际热核聚变实验堆:从||{
一些(cc.clone())
})
}

我想我也可以重新构造问题,分发一些类似于
Rc
的东西,它们仍然可以复制,但这些副本会很便宜,但我很好奇是否有一种方法可以通过引用来实现这一点。

如评论中所述,问题是,您不能返回对某个对象的引用,而随后又希望对其进行变异。因为有些东西仍然被“借用”并在别处被引用

如果这是可能的,那么假设您将所有内容都放入一个
Vec
,然后如果这导致了一个包含3项的
Vec
。然后假设它对同一实例有3个引用,那么所有3个项都将具有与最后一个项相同的状态

简而言之,你不会得到你想要的
x
f(x)
f(x))
,而是
f(x))
f(x))
f(x))


既然你想要更少的克隆,那么听起来你更像是想要一个
fn next\u state(&mut self)
方法。然后您可以迭代并调用
cubes.next_state()
,它将
cubes
更新到它的下一个状态,而不会发生不必要的克隆

impl多维数据集{
fn下一个_状态(&mut self){
...
}
}
fn main(){
对于0..10中的uu{
//用立方体做些什么
cubes.next_state();
}
}
按照您已经完成的工作,您可以使用创建一个
iter\u states()
方法,该方法调用
next\u state()
,并返回一个克隆

impl多维数据集{
fn iter_states(&self)->impl迭代器{
让mut next=self.clone();
国际热核实验堆:从| fn(移动| |{
让current=next.clone();
next.next_state();
一些(当前)
})
}
}
或者,您也可以引入自定义的
CubesIter
类型。然后您可以将
多维数据集
转换为
迭代器

struct CubesIter{
下一个:立方体,
}
立方体迭代器的impl{
类型项=立方体;
fn下一步(&mut self)->选项{
让current=self.next.clone();
self.next.next_state();
一些(当前)
}
}
多维数据集的impl迭代器{
类型项=立方体;
输入iter=CubesIter;
fn进入iter(self)->self::进入iter{
立方码{next:self}
}
}
这将允许您执行以下操作:

let cubes:cubes=。。。;
对于多维数据集中的状态{
...
}

请注意,上述操作将无限期地迭代。因此,您必须添加一些停止状态或条件。

如注释中所述,问题是您无法返回对某个对象的引用,而随后又希望对其进行变异。因为有些东西仍然被“借用”并在别处被引用

如果这是可能的,那么假设您将所有内容都放入一个
Vec
,然后如果这导致了一个包含3项的
Vec
。然后假设它对同一实例有3个引用,那么所有3个项都将具有与最后一个项相同的状态

简而言之,你不会得到你想要的
x
f(x)
f(x))
,而是
f(x))
f(x))
f(x))


既然你想要更少的克隆,那么听起来你更像是想要一个
fn next\u state(&mut self)
方法。然后您可以迭代并调用
cubes.next_state()
,它将
cubes
更新到它的下一个状态,而不会发生不必要的克隆

impl多维数据集{
fn下一个_状态(&mut self){
...
}
}
fn main(){
对于0..10中的uu{
//用立方体做些什么
cubes.next_state();
}
}
按照您已经完成的工作,您可以使用创建一个
iter\u states()
方法,该方法调用
next\u state()
,并返回一个克隆

impl多维数据集{
fn iter_states(&self)->impl迭代器{
让mut next=self.clone();
国际热核实验堆:从| fn(移动| |{
让current=next.clone();
next.next_state();
一些(当前)
})
}
}
或者,您也可以引入自定义的
CubesIter
类型。然后您可以将
多维数据集
转换为
迭代器

struct CubesIter{
下一个:立方体,
}
立方体迭代器的impl{
类型项=立方体;
fn下一步(&mut self)->选项{
让current=self.next.clone();
self.next.next_state();
一些(当前)
}
}
多维数据集的impl迭代器{
类型项=立方体;
输入iter=CubesIter;
fn进入iter(self)->self::进入iter{
立方尺