为什么 in case of addfunctionmut关键字不是强制的,但 in case ofadd_assign却是强制的?
use std::ops::{Add, AddAssign};
let mut ssa = String::new();
let rr = move || { // no mut for rr is needed
ssa = ssa.add("ds");
println!("{}", ssa);
};
rr();
let mut ssa = String::new();
let mut rr = move || { // mut is mandatory
ssa.add_assign("ds");
println!("{}", ssa);
};
rr();
Run Code Online (Sandbox Code Playgroud)
Fn如果可能,则闭包实现FnMut,否则仅实现FnOnce。第一个ssa = ssa.add("ds")仅包含实现的闭包FnOnce(因为ssa已移出,并且如果add出现恐慌并且捕获了恐慌,则不会替换它;因此在一般情况下不能调用两次)。第二个闭包使用ssa.add_assign("ds")ImplementsFnOnce和FnMut。
Fn当调用闭包时,如果实现了,编译器将使用 from (with )的方法,否则如果实现了,则使用 from (with )&self的方法,否则使用(with )的方法。仅在需要的情况下。FnMut&mut selfFnOnceselfFnMutlet mut