有没有办法创建像这个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,FnMut和FnOnce).第三,它不会编译:
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被借用.
| 归档时间: |
|
| 查看次数: |
3126 次 |
| 最近记录: |