我试图从Filter类型的闭包中借用一个哈希集--基本上,我想阻止用户不止一次地选择相同的选项--这是我的代码
pub fn getRotors() -> () {
let mut selectedrotors: HashSet<Rotors> = HashSet::new();
let options: Vec<Rotors> = Rotors::iter().collect();
let filter: Filter<Rotors> = &|_, cur_option, _, _| match selectedrotors.contains(cur_option) { // Borrow occurs here
true => false,
false => true,
};
for i in 0..3 {
// Get Rotor from user
let r: Rotors = Select::new("Select a rotor", options.to_vec())
.with_filter(filter)
.prompt()
.unwrap();
selectedrotors.insert(r); // immutable borrow occurs here e0502
// Get char from user
}
()
}我希望selectedrotors.contains只需要对自身的不可更改的访问,所以我在这里感到困惑
发布于 2022-10-21 06:29:07
你把这两笔借款搞混了。在闭包中有一个不可变的selectedrotors借用,在循环中有一个可变的借入。存在一个问题,因为您试图在循环中使用可变的借入,而来自闭包的不可变的借入仍然是活动的(因为闭包将在下一个循环迭代中使用)。
您可以通过在循环中声明筛选器来解决这个问题,以便在使用可变的过滤器之前可以释放不可变的借贷:
pub fn getRotors() -> () {
let mut selectedrotors: HashSet<Rotors> = HashSet::new();
let options: Vec<Rotors> = Rotors::iter().collect();
for i in 0..3 {
let filter: Filter<Rotors> = &|_, cur_option, _, _| match selectedrotors.contains(cur_option) {
true => false,
false => true,
};
// Get Rotor from user
let r: Rotors = Select::new("Select a rotor", options.to_vec())
.with_filter(filter)
.prompt()
.unwrap();
// filter is no longer used here, so its borrow can be released
// allowing the mutable borrow in the next line to proceed.
selectedrotors.insert(r);
// Get char from user
}
()
}发布于 2022-10-21 14:18:10
我对你使用的板条箱不太了解,但是既然你接受了Jmb的回答,我想指出你的过滤器是很奇怪的。这里有一个更好的方法:
for i in 0..3 {
// Get Rotor from user
let r = Select::new("Select a rotor", options.to_vec())
.with_filter(|_, cur_option, _, _| !selected_rotors.contains(cur_option))
.prompt()
.unwrap();
selected_rotors.insert(r);
}https://stackoverflow.com/questions/74147612
复制相似问题