gpt4 book ai didi

rust - 如何将循环中的变量更新为对循环内创建的值的引用?

转载 作者:行者123 更新时间:2023-11-29 07:52:03 28 4
gpt4 key购买 nike

我想进入一个带有函数借用的变量 n 的循环。在每一步,n 都取一个新值;当退出循环时,工作在其他变量的帮助下完成,n永远不会再次使用。

如果我不使用引用,我有这样的东西:

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 是使用 qm 进行一些计算的结果,但它是一个 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 中存在一种干净的方法。

将我的问题视为非常笼统;我并不是要为特定问题寻求一些临时解决方案。

最佳答案

作为Chris Emerson points out ,你正在做的是 不安全 并且用 C 编写这样的代码可能也不合适。您引用的变量在每次循环迭代 结束时超出范围,因此您将在下一次迭代开始时有一个悬空指针。这将导致 Rust 试图防止的所有内存错误; Rust 阻止了您做一些您认为安全的坏事

如果您想要可以借用或拥有的东西;那是一个Cow :

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));
}

关于rust - 如何将循环中的变量更新为对循环内创建的值的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41744878/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com