Rust 闭包fn,Fn,FnMut,FnOnce 和move关键字

struct ABC<B,C,D>
where
	B: Fn(),	//可以捕获 引用
	C: FnMut(),	//可以捕获 可变引用
	D: FnOnce()	//可以捕获 移动
{
	A:fn(),//不能捕获环境
	B:B,
	C:C,
	D:D,
}

fn main() {
	let mut a=String::from("aaa");
	let mut f = ABC{
		A:||{
			// println!("{}",&a);//报错,fn类型不能捕获环境
		},
		B:||{
			// println!("{}",&a);//aaa
		},
		C:||{
			// let a=&mut a;
			// *a = String::from("bbb");
		},
		D:||{
			a;//所有权移动进函数
		},
	};
	println!("{}",a);//报错,没有所有权
}

作为参数

fn f<F>(f:F)
where F:Fn() {
	f();
}
fn main() {
	f(||{});
}

作为返回值

fn f1() -> impl Fn(i32) {
	|x|{println!("{}",x)}
}
fn f2() -> impl Fn(i32) {
	let a=100;
	move |x|{println!("{}",x+a)}//如果不获取所有权,那么a就死亡,后期调用就会异常,所以编译器不会通过
}
fn main() {
	f1()(9);//9
	f2()(9);//109
}

使用 move 会强制闭包取得被捕获变量的所有权
关键字move的作用是将所引用的变量的所有权转移至闭包内,通常用于使闭包的生命周期大于所捕获的变量的原生命周期(例如将闭包返回或移至其他线程)

发散函数绝不会返回。 它们使用 ! 标记,这是一个空类型

参考

官方文档 - 散发函数
知乎

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾仪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值