在C中,在单个表达式中分配和比较是很常见的:
n = n_init;
do {
func(n);
} while ((n = n.next) != n_init);
Run Code Online (Sandbox Code Playgroud)
据我了解,这可以用Rust表示:
n = n_init;
loop {
func(n);
n = n.next;
if n == n_init {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
其作用与C版本相同(假设循环体不使用continue).
是否有更简洁的方式在Rust中表达这个,或者上面的例子是理想的?
出于这个问题的目的,假设所有权或满足借用检查器不是问题.由开发人员来满足这些要求.
例如,作为整数:
n = n_init;
loop {
func(&vec[n]);
n = vec[n].next;
if n == n_init {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来很明显,Rust的例子是惯用的Rust - 但是我希望将这种循环风格转移到Rust,我很想知道是否有更好/不同的表达方式.
在Rust中表示迭代的惯用方法是使用Iterator.因此,您将实现一个迭代器来执行该操作n = n.next,然后使用for循环迭代迭代器.
struct MyIter<'a> {
pos: &'a MyData,
start: &'a MyData,
}
impl<'a> Iterator for MyIter<'a> {
type Item = &'a MyData;
fn next(&mut self) -> Option<&'a MyData> {
if self.pos as *const _ == self.start as *const _ {
None
} else {
let pos = self.pos;
self.pos = self.pos.next;
Some(pos)
}
}
}
Run Code Online (Sandbox Code Playgroud)
它留给读者一个练习,使这个迭代器能够从第一个元素开始,而不是从第二个元素开始.