gpt4 book ai didi

rust - 如何让 Rust 函数传播状态?

转载 作者:行者123 更新时间:2023-11-29 08:26:45 25 4
gpt4 key购买 nike

我需要编写一个 Rust 函数,它可以修改在更高层函数中定义的状态,并将它从一个函数调用传播到迭代器中的另一个函数调用(参见下面的伪代码)。

在糟糕的 C 语言中,我会使用共享指针来完成。当然,我明白为什么我不应该这样做,为什么我不能在 Rust 中这样做。

我找到的解决方法是添加一个额外的函数参数和一个额外的返回参数:

fn f(inputs ..., s) {
let mut s = s;
// computations that rely on the value of s
// ...
outputs ..., s
}

fn main() {
let mut s;
for ... {
let (outputs ..., x) = f(inputs ..., s);
s = x;
}
}

这在编程风格方面似乎有点沉重,我希望有一个更轻的结构(也许更单子(monad)),我想使用闭包。我应该如何写它对我来说并不明显。

最佳答案

答案在于引用。

C 中的共享指针附带警告,说明何时何地可以这样做,何时不能。 Rust 有一个借用检查器来确保你没有用指针做任何愚蠢/不安全的事情,以防止人们在 C 中遇到的大部分问题。

例如,考虑对您的代码稍作改动(纯粹为了编译)。可以重写如下:

fn do_with(s: &mut u8, item: u8) {
*s = *s + item;
}
fn main() {
let mut s: u8 = 0;
(1..10).for_each(|item| do_with(&mut s, item));
println!("{}", s)
}

您会从 C 中识别出这种语法,但它比 C 安全得多,因为借用检查器可确保您的代码在任何给定时间都只有一个可变引用。因此,代码在每一步都被认为是健全的并且可以编译。

您也可以按照以前的方式进行操作,即有效地在每次调用中传递值。但是,这确实会导致代码的可读性降低和多一层间接寻址。示例如下:

fn do_with(s: u8, item: u8) -> u8 {
s + item
}
fn main() {
let mut s: u8 = 0;
(1..10).for_each(|item| s = do_with(s, item));
println!("{}", s)
}

在 C 中,指针的危险主要在于对它们的维护和维护。由于 Rust 会为您检查并执行此操作(并且这 - 积极地 - 防止您在使用 futures 时搬起石头砸自己的脚),这在很大程度上不是问题。

关于rust - 如何让 Rust 函数传播状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53924904/

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