无法创建本地函数,因为"无法捕获fn项目中的动态环境"

Eva*_*Red 9 function rust

有没有办法创建像这个Python代码的本地函数?

def h():
    final = []
    def a():
        for i in range(5):
            final.append(i)
        a()
        return final
Run Code Online (Sandbox Code Playgroud)

我试过了,但失败了:

fn h() -> Vec<i32> {
    let mut ff = vec![];
    fn a() {
        for i in 0..5 {
            ff.push(i)
        }
    };
    a();
    ff
}
Run Code Online (Sandbox Code Playgroud)
 error[E0434]: can't capture dynamic environment in a fn item; use the || { ... } closure form instead
 --> src/main.rs:5:13
  |
5 |             ff.push(i)
  |             ^^
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 17

Rust中的函数不会捕获周围环境中的变量.Rust中的"本地"函数实际上只是一个全局可见的全局函数; 它不能比任何其他全局功能做任何事情.

相反,锈病闭包是从他们不同的功能捕捉他们的环境变量.这看起来像这样:

fn h() -> Vec<i32> {
    let mut ff = vec![];
    let mut a = || {
        for i in 0..5{
            ff.push(i)
        }
    };
    a();
    ff
}
Run Code Online (Sandbox Code Playgroud)

有三点需要注意.首先,append不是你想要的,你想要的push.您应该查看文档Vec以查看可用的内容和方法.其次,你必须做出a,因为它的变异的东西它捕获可变(也看到这个答案约Fn,FnMutFnOnce).第三,它不会编译:

error[E0505]: cannot move out of `ff` because it is borrowed
 --> <anon>:9:9
  |
3 |         let mut a = || {
  |                     -- borrow of `ff` occurs here
...
9 |         ff
  |         ^^ move out of `ff` occurs here
Run Code Online (Sandbox Code Playgroud)

问题是通过创建闭包,你必须给它一个可变的借位ff.但是,借款可以防止其他人移动或以其他方式搞乱ff.您需要缩短借入存在的时间长度:

fn h() -> Vec<i32> {
    let mut ff = vec![];
    {
        let mut a = || {
            for i in 0..5{
                ff.push(i)
            }
        };
        a();
    }
    ff
}
Run Code Online (Sandbox Code Playgroud)

这有效,但有点笨重.这也是不必要的; 只需将借用ff明确地传递给本地函数,就可以更加干净地重写上述内容:

fn h() -> Vec<i32> {
    let mut ff = vec![];
    fn a(ff: &mut Vec<i32>) {
        for i in 0..5{
            ff.push(i)
        }
    }
    a(&mut ff);
    ff
}
Run Code Online (Sandbox Code Playgroud)

最后一个是最好的(如果你能够使用它),因为它保持清洁的时候和为什么ff被借用.