【发布时间】:2016-11-03 09:16:13
【问题描述】:
在 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,我很想知道是否有更好/不同的方式来表达它.
【问题讨论】:
-
我会考虑将模式包装到迭代器中,因此您可以执行以下操作:
for n in some_iter(n_init) { func(n) } -
能否请您发布完整的示例。每次您发布 sn-p 时,我们都必须猜测所涉及的类型可能是什么。他们是
Copy吗?他们对某事拥有所有权吗?我们不知道!我们不知道! -
-
这个问题被标记为:
Questions seeking debugging help,有人能解释一下为什么吗? - 它的目的是关于如何表达流量控制的问题。这里没有要调试的错误。 -
@ideasman42:问题是这使得 answerers 的工作变得更加困难,因为 ownership 是 Rust 的核心理念,因此答案取决于您使用仿射类型、借用还是
Copy类型。这就像你的最后一个问题,事后添加test()第一次回答false的条件......如果从一开始就将其编码在代码中,我本可以知道我的答案不适合。但由于我无法读懂您的想法,因此我提供了一个合适的答案,而您在更改了问题后不再合适。所以..请完成。
标签: rust control-flow