gpt4 book ai didi

rust - 闭包需要对 lambda 函数的唯一访问

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

我正在学习 Rust,并且已经实现了一些简单的代码来试验闭包 - 但我遇到了借用检查器的问题,我不确定如何解决。

编译以下函数时

fn twice(x:int, f:|int| -> int) -> int {
f(f(x))
}

出现以下错误

closure requires unique access to `f` but it is already borrowed

我正在阅读指南并且对借用检查器为什么不喜欢这个有一定的了解 - 但我不确定如何解决它。

我可以通过先将第一次调用的结果分配给一个临时变量,然后再次调用 f(..) 来解决这个问题。然而,这感觉不雅。

有没有一种更简洁/更好的方式来编写 f(f(x)),或者有什么方法可以让编译器相信这是安全的?

最佳答案

完整的错误信息是:

<anon>:2:7: 2:8 error: closure requires unique access to `f` but it is already borrowed
<anon>:2 f(f(x))
^
<anon>:2:5: 2:6 note: previous borrow of `f` occurs here; the unique capture prevents subsequent moves or borrows of `f` until the borrow ends
<anon>:2 f(f(x))
^
<anon>:2:12: 2:12 note: previous borrow ends here
<anon>:2 f(f(x))
^

也就是说,外部调用在某种意义上是保留f,防止它被优先使用。这与 issue #6268 非常相似,它涉及方法而不是闭包。

正如你所说,使用临时是一种修复,并且是最合理的修复。

fn twice(x:int, f:|int| -> int) -> int {
let y = f(x);
f(y)
}

关于rust - 闭包需要对 lambda 函数的唯一访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942873/

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