İçine basitleştiren bir sorunla karşılaştık aşağıdadır: Bu hata üretirKendisini değiştiren ve sonra kendi başına bir referans veren bir Yineleyici yazabilir miyim?
struct MyIter {
vec: Vec<i8>,
}
fn fill_with_useful_data(v: &mut Vec<i8>) {
/* ... */
}
impl<'a> Iterator for MyIter {
type Item = &'a [i8];
fn next(&mut self) -> Option<&'a [i8]> {
fill_with_useful_data(&mut self.vec);
Some(&self.vec)
}
}
fn main() {
for slice in (MyIter { vec: Vec::new() }) {
println!("{}", slice);
}
}
:
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:9:6
|
9 | impl<'a> Iterator for MyIter {
| ^^ unconstrained lifetime parameter
fikri yineleyici kendi alanlarında ve en yansıtan işin bir demet yapmasıdır Her adımda, çağrı koduna kendi başına bir referans verir. Bu durumda, onu referansın yerine devletin bir kopyasını elde etmek için modelleyebilirdim, ancak bunun mümkün olmadığını ya da sakıncalı bir şekilde pahalı olduğunu varsayalım. ariyet denetleyicisi vermiştir referans hala yineleyici durumunu incelemek için kullanılabilir ederken .next()
yine aradı olmadığından emin olun çünkü
Sezgisel bu bir problem olmamalı, ancak Iterator
özellik sağlamak için görünmüyor Bu tür bir şey doğrudan. Yineleyicideki vektöre sadece bir referansa dayanmak gibi birtakım permütasyonlarda bile veya iteratörün daha önceki tipte pişirilen yaşamları almak için bir referans ya da bir şey yapması durumunda, borç kontrolöründen bir şey alamıyorum.
"Iterators yielding mutable references" blogpostunu okudum ancak değiştirilebilen başvurular içermeyen benim sorunum için geçerli olup olmadığından emin değilim.
Pekala, sadece "Yineleyici" yi kullanmayı bıraktım ve makro için kendi öz döngüsünü yaptım. .collect() 'ın nasıl çalışacağını düşünmedim. – ben
Bu, 'for' döngüsünü kullanamayacağınız geçişler için de iyidir:' Bazılarına izin ver (element) = iter.next() {... ' – bluss
Gelecekte referans için bu tür yineleyici (' fn next (& 'bir öz) ') genellikle * akışlı yineleyici * olarak adlandırılır. Bazı tartışma örnekleri [1] (https://users.rust-lang.org/t/returning-borrowed-values-from-an-iterator/1096), [2] (https://www.reddit.com/r/rust/comments/2t1rxx/more_general_iterator_trait /) ve [bir formunu uygulayan bir kasa] (https://github.com/sfackler/streaming-iterator). – Shepmaster