|
|
|
@ -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给出的类型标注:
|
|
|
|
|
|
|
|
|
|