从这里选取代码片段,下面的代码无法编译。
我不明白为什么第一个代码片段是非法的:它实际上和第二个代码片段是一样的,只是写得更加简洁。更具体地说,为什么必须对
fn foobar<F>(mut f: F)
where F: FnMut(i32) -> i32
{
println!("{}", f(f(2)));
// error: cannot borrow `f` as mutable more than once at a time
}
fn main() {
foobar(|x| x * 2);
}
但这确实
fn foobar<F>(mut f: F)
where F: FnMut(i32) -> i32
{
let tmp = f(2);
println!("{}", f(tmp));
}
fn main() {
foobar(|x| x * 2);
}
我不明白为什么第一个代码片段是非法的:它实际上和第二个代码片段是一样的,只是写得更加简洁。更具体地说,为什么必须对
f
进行两次可变借用来调用 f(f(2))
?它可以简单地借用内部的 f
来计算 f(2)
的值,然后借用外部的 f
并将其应用于该值。
f(f(2))
不太好看,将其中一个值添加到变量中可以提高可读性。但再次强调,这只是个人意见。 - Dominik