rust - 在 Rust 中实现迭代器
问题描述
我正在制作一个生锈的迭代器。在next()
我要提取的方法next_element
中current_element
,将返回哪个,并创建新Term
实例并将其设置为next_element
:
pub struct Term {
pub coefficient: f64,
pub index: i32,
pub exponent: f64,
}
pub struct SeriesIterator {
next_element: Term,
}
impl Iterator for SeriesIterator {
type Item = Term;
fn next(&mut self) -> Option<Self::Item> {
let current_element = self.next_element;
self.next_element = Term {
coefficient: 1.0,
index: current_element.index + 1,
exponent: f64::from(current_element.index + 1),
};
Some(current_element)
}
}
如何将所有权next_element
移入current_element
其中,最终将随着归还而移出next()
?
cannot move out of `self.next_element` which is behind a mutable reference
|
| let current_element = self.next_element;
| ^^^^^^^^^^^^^^^^
解决方案
- 使用
std::mem::replace
,试试这个:
fn next(&mut self) -> Option<Self::Item> {
let index = self.next_element.index + 1;
Some(std::mem::replace(
&mut self.next_element,
Term {
coefficient: 1.0,
index: index,
exponent: f64::from(index),
},
))
}
- 使用
#[derive(Clone, Copy)]
:
fn next(&mut self) -> Option<Self::Item> {
let current_element = self.next_element; // copy
self.next_element.coefficient = 1.0;
self.next_element.index += 1;
self.next_element.exponent = f64::from(self.next_element.index);
Some(current_element)
}
试试这个工作示例:
#[derive(Clone, Copy)]
pub struct Term {
pub coefficient: f64,
pub index: i32,
pub exponent: f64,
}
pub struct SeriesIterator {
next_element: Term,
}
impl Iterator for SeriesIterator {
type Item = Term;
fn next(&mut self) -> Option<Self::Item> {
let current_element = self.next_element; // copy
self.next_element.coefficient = 1.0;
self.next_element.index += 1;
self.next_element.exponent = f64::from(self.next_element.index);
Some(current_element)
}
}
fn main() {
let mut t = SeriesIterator {
next_element: Term {
coefficient: 1.0,
index: 0,
exponent: 1.0,
},
};
let next = t.next().unwrap();
println!("{}", next.index); // 0
println!("{}", t.next_element.index); // 1
let next = t.next().unwrap();
println!("{}", next.index); // 1
println!("{}", t.next_element.index); // 2
}
输出:
0
1
1
2
推荐阅读
- ms-word - 是否有可能为连续的多个图表添加标题?
- java - scala编译错误:无法解析重载方法'withTransaction'
- wix - 计算并显示 WiX Burn 安装程序所需的空间
- assembly - 它如何知道字符串何时结束而没有终止符?(代码如下)
- ios - 在 webview SwiftUI 中获取捕获图像问题
- mysql - MySQL数据库在计数或总和和分组上失败 - 不是其他线程的重复
- kubernetes - Kubernetes - 一些 HPA 正在根据其他 HPA 的指标而不是他们自己的指标进行扩展
- c - 在扫描仪中递归地跳过嵌套注释
- ios - 如何在我们的项目中使用指令框架
- html - 在不使用外部库的情况下显示 pdf 文件