fn main() {
let mut my_string = String::from("Hello, Rust!");
let mut my_s_ref = &mut my_string;
let consume_string = || {
my_s_ref
};
consume_string();
// consume_string();
println!("闭包外部消费字符串: {}", my_string);
}
fn main() {
let my_string = String::from("Hello, Rust!");
let my_s_ref = & my_string;
let consume_string = || {
// my_s_ref.push_str("string");
my_s_ref
};
consume_string();
consume_string();
println!("闭包外部字符串: {}", my_string);
}
以上两段代码,一个返回String的可变引用,一个返回不可变引用,为什么返回可变引用的闭包实现了FnOnce,返回不可变引用的闭包只实现了Fn呢?
rust返回引用时,遵循什么规则?和my_s_ref本身有关还是my_string有关?
closure 都是
FnOnce
,Fn 也是FnOnce
。可以被多次调用的会是
FnMut
。FnMut
也是FnOnce
。可以被多次调用并且不改变“状态”的是
Fn
。Fn
既是FnMut
,也是FnOnce
。注意
&String
可以Copy
,但是&mut String
不行。所以第一个my_s_ref
被 Move 了,于是不能多次调用。它就只能是FnOnce
。但是后一个里面my_s_ref
可以Copy
,所以可以反复调用。closures