rust - 可以在表达式中结合赋值和比较吗?

标签 rust control-flow

在 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/

相关文章:

arrays - Rust-如何初始化包含HashSet字段的结构数组?

performance - 为什么我的 Rust 程序比等效的 Java 程序慢?

rust - 合并盒装元素

java - 使用 Java 从具有访问者模式的 AST 构建控制流图

if-statement - 为什么针对多个值对一个变量进行非等式检查总是返回 true?

unit-testing - 如何编写确保编译错误的测试?

methods - 定义元组方法

c++ - 如何从 lambda 中的函数返回?

django - django rest框架的控制流程是什么

algorithm - 控制流异常