diff --git a/src/advance/functional-programing/closure.md b/src/advance/functional-programing/closure.md index 781556ba..853d1898 100644 --- a/src/advance/functional-programing/closure.md +++ b/src/advance/functional-programing/closure.md @@ -490,7 +490,7 @@ fn exec<'a, F: FnMut(&'a str)>(mut f: F) { } ``` -我们注意到这段代码中`update_string`没有使用mut关键字修饰,而上文我们提到想要在闭包内部捕获可变借用,需要用关键词把该闭包声明为可变类型。我们确实这么做了————`exec(mut f: F)`表明我们的`exec`接收的是一个可变类型的闭包。看似这段代码中`update_string`声明为不可变闭包,但是`exec(mut f: F)`函数接收的又是可变参数,为什么可以正常执行呢? +我们注意到这段代码中`update_string`没有使用mut关键字修饰,而上文我们提到想要在闭包内部捕获可变借用,需要用关键词把该闭包声明为可变类型。我们确实这么做了———`exec(mut f: F)`表明我们的`exec`接收的是一个可变类型的闭包。看似这段代码中`update_string`声明为不可变闭包,但是`exec(mut f: F)`函数接收的又是可变参数,为什么可以正常执行呢? 是的,rust不可能接受类型不匹配的形参和实参通过编译,这说明`update_string`一定是一个可变类型的闭包,我们不妨看看rust-analyzer给出的类型标注: