为何可变函数参数中不允许借用?Rust编译报错疑问
解决Rust中HashMap的可变/不可变借用冲突问题
这个错误的核心在于Rust严格的借用检查规则——在同一个作用域内,不能同时存在对同一变量的可变借用和不可变借用,哪怕这种冲突出现在函数调用的参数表达式里。
你可能会疑惑:参数不是应该先计算完再传给函数吗?但Rust的求值逻辑和借用检查的判定是这样的:当你调用compressed_data.reserve(...)时,会先创建对compressed_data的可变借用(因为reserve需要修改容器内部状态),而此时参数里的compressed_data.len()又需要对同一个变量发起不可变借用。借用检查器认为这两个借用的生命周期是重叠的,直接违反了规则,于是抛出E0502错误。
修复方法
只需要把参数的计算提前到一个临时变量中,彻底分开不可变借用和可变借用的时机即可:
let needed_capacity = folder_file_paths.len() - compressed_data.len(); if needed_capacity > 0 { compressed_data.reserve(needed_capacity); }
这样先完成compressed_data.len()的不可变借用,把结果存在needed_capacity里;之后调用reserve时,只会触发对compressed_data的可变借用,完全符合Rust的借用规则。
额外补充:其实if判断可以简化为检查needed_capacity > 0——如果folder_file_paths.len()小于等于compressed_data.len(),差值为0或负数,reserve传入非正数不会执行任何操作,不过保留判断也完全没问题。
内容的提问来源于stack exchange,提问作者8176135
相关产品推荐
相关产品推荐

