我想进入一个带有变量的循环n
这是函数借用的。每一步,n
取新值;当退出循环时,工作在其他变量的帮助下完成,并且n
will never再次使用。
如果我不使用引用,我会有这样的东西:
fn test(n: Thing) -> usize {
// stuff
let mut n = n;
for i in 1..10 {
let (q, m) = n.do_something(...);
n = m;
// stuff with x
}
x
}
x
是一些计算的结果q
and m
但这是一个usize
类型,我在这部分代码中没有遇到任何问题。我没有测试这段代码,但这就是想法。我可以使这样编写的代码工作。
因为我想做一个参考;我试着写:
fn test(n: &Thing) -> usize {
// stuff
let mut n = n;
for i in 1..10 {
let (q, m) = (*n).do_something(...);
n = &m;
// stuff with x
}
x
}
现在代码将无法编译,因为m
寿命比n
。我尝试通过做一些棘手的事情或克隆事情来使其发挥作用,但这不是正确的方法。在 C 中,代码可以工作,因为我们不关心什么n
指向退出循环的时间n
循环后不使用。我完全理解这是 Rust 和 C 的不同之处,但我很确定 Rust 中存在一种干净的方法。
认为我的问题非常普遍;我不要求一些ad-hoc针对特定问题的解决方案。
As 克里斯·爱默生指出 https://stackoverflow.com/a/41745081/155423,你正在做的是unsafe而且用 C 语言编写这样的代码可能也不合适。您引用的变量在每个末尾超出范围循环迭代,因此你会有一个悬垂指针在下一次迭代开始时。这将导致 Rust 试图阻止的所有内存错误;Rust 阻止你做一些你认为安全的坏事.
如果您想要可以借用或拥有的东西;那是一个Cow https://doc.rust-lang.org/std/borrow/enum.Cow.html:
use std::borrow::Cow;
#[derive(Clone)]
struct Thing;
impl Thing {
fn do_something(&self) -> (usize, Thing) {
(1, Thing)
}
}
fn test(n: &Thing) -> usize {
let mut n = Cow::Borrowed(n);
let mut x = 0;
for _ in 1..10 {
let (q, m) = n.do_something();
n = Cow::Owned(m);
x = x + q;
}
x
}
fn main() {
println!("{}", test(&Thing));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)