Я хотел бы сделать итератор, который генерирует поток простых чисел. Мой общий мыслительный процесс был обернуть итератор с последовательными фильтрами так, например, начать сКак создать изменяемые итераторы?
let mut n = (2..N)
Тогда для каждого простого числа вы мутировать итератор и добавить на фильтре
let p1 = n.next()
n = n.filter(|&x| x%p1 !=0)
let p2 = n.next()
n = n.filter(|&x| x%p2 !=0)
Я пытаюсь используйте следующий код, но я не могу заставить его работать
struct Primes {
base: Iterator<Item = u64>,
}
impl<'a> Iterator for Primes<'a> {
type Item = u64;
fn next(&mut self) -> Option<u64> {
let p = self.base.next();
match p {
Some(n) => {
let prime = n.clone();
let step = self.base.filter(move |&: &x| {x%prime!=0});
self.base = &step as &Iterator<Item = u64>;
Some(n)
},
_ => None
}
}
}
Я поиграл с вариациями, но я не могу показаться, чтобы получить время жизни и типы совпасть. Сейчас компилятор говорит мне
- Я не могу мутировать self.base
- переменная премьер не живут достаточно долго
Здесь ошибка я получаю
solution.rs:16:17: 16:26 error: cannot borrow immutable borrowed content `*self.base` as mutable
solution.rs:16 let p = self.base.next();
^~~~~~~~~
solution.rs:20:28: 20:37 error: cannot borrow immutable borrowed content `*self.base` as mutable
solution.rs:20 let step = self.base.filter(move |&: &x| {x%prime!=0});
^~~~~~~~~
solution.rs:21:30: 21:34 error: `step` does not live long enough
solution.rs:21 self.base = &step as &Iterator<Item = u64>;
^~~~
solution.rs:15:39: 26:6 note: reference must be valid for the lifetime 'a as defined on the block at 15:38...
solution.rs:15 fn next(&mut self) -> Option<u64> {
solution.rs:16 let p = self.base.next();
solution.rs:17 match p {
solution.rs:18 Some(n) => {
solution.rs:19 let prime = n.clone();
solution.rs:20 let step = self.base.filter(move |&: &x| {x%prime!=0});
...
solution.rs:20:71: 23:14 note: ...but borrowed value is only valid for the block suffix following statement 1 at 20:70
solution.rs:20 let step = self.base.filter(move |&: &x| {x%prime!=0});
solution.rs:21 self.base = &step as &Iterator<Item = u64>;
solution.rs:22 Some(n)
solution.rs:23 },
error: aborting due to 3 previous errors
Почему Rust не позволил мне сделать это?
Ну хорошо, я полностью забыл об этом. Благодаря! –
* и с объектами ссылочных объектов нет нигде, вы можете его сохранить * - кроме того, фактический ** размер ** итератора 'base' изменяется, поскольку он становится все более и более вложенным. Таким образом, нам нужно использовать распределение кучи, чтобы размер 'Primes' всегда был постоянным. – Shepmaster
@Shepmaster, размер ссылочного объекта объекта не изменяется, afaik. Единственная причина, по которой он не может быть использован, - это собственность. –