为什么 lambda 函数中的“add_assign”需要将 lambda 函数变量标记为可变,而手动赋值的“add”则不需要?

Mar*_*yan 10 lambda rust

为什么 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)

jil*_*les 0

Fn如果可能,则闭包实现FnMut,否则仅实现FnOnce。第一个ssa = ssa.add("ds")仅包含实现的闭包FnOnce(因为ssa已移出,并且如果add出现恐慌并且捕获了恐慌,则不会替换它;因此在一般情况下不能调用两次)。第二个闭包使用ssa.add_assign("ds")ImplementsFnOnceFnMut

Fn当调用闭包时,如果实现了,编译器将使用 from (with )的方法,否则如果实现了,则使用 from (with )&self的方法,否则使用(with )的方法。仅在需要的情况下。FnMut&mut selfFnOnceselfFnMutlet mut