在 C 中,通常在单个表达式中进行赋值和比较:
n = n_init;
do {
func(n);
} while ((n = n.next) != n_init);
据我了解,这可以用 Rust 表示为:
n = n_init;
loop {
func(n);
n = n.next;
if n == n_init {
break;
}
}
它与 C 版本的工作方式相同(假设循环体不使用 continue
)。
在 Rust 中是否有更简洁的方式来表达这一点,或者上面的示例是否理想?
就此问题而言,承担所有权或满足借用检查员的要求不是问题。满足这些要求取决于开发人员。
例如,作为一个整数:
n = n_init;
loop {
func(&vec[n]);
n = vec[n].next;
if n == n_init {
break;
}
}
这似乎很明显,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)
}
}
}
将此迭代器调整为能够从第一个元素开始而不是从第二个元素开始,留给读者作为练习。
关于rust - 可以在表达式中结合赋值和比较吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40397672/