Rust a中的所有权问题;而让",;
当我添加代码以改变Rust a中的所有权问题;而让",;,rust,borrow-checker,Rust,Borrow Checker,当我添加代码以改变items变量时,问题就出现了。 以下代码示例未编译: #[derive(Debug)] struct Item { value: u16, weight: u16, name: &'static str, //ratio: f32 } impl PartialEq for Item { fn eq(&self, other: &Item) -> bool { self.name == ot
items
变量时,问题就出现了。
以下代码示例未编译:
#[derive(Debug)]
struct Item {
value: u16,
weight: u16,
name: &'static str,
//ratio: f32
}
impl PartialEq for Item {
fn eq(&self, other: &Item) -> bool {
self.name == other.name
}
}
#[derive(Debug)]
struct KnapSack<'a> {
capacity: u16,
current: u16,
items: Vec<&'a Item>
}
fn main() {
let mut items = vec![
Item { name: "map", weight: 9, value: 150},
Item { name: "compass", weight: 13, value: 35},
Item { name: "water", weight: 153, value: 200},
Item { name: "sandwich", weight: 50, value: 160},
Item { name: "glucose", weight: 15, value: 60},
Item { name: "tin", weight: 68, value: 45},
Item { name: "banana", weight: 27, value: 60},
Item { name: "apple", weight: 39, value: 40},
Item { name: "cheese", weight: 23, value: 30},
Item { name: "beer", weight: 52, value: 10},
Item { name: "suntan cream", weight: 11, value: 70},
Item { name: "camera", weight: 32, value: 30},
Item { name: "T-shirt", weight: 24, value: 15},
Item { name: "trousers", weight: 48, value: 10},
Item { name: "umbrella", weight: 73, value: 40},
Item { name: "waterproof trousers", weight: 42, value: 70},
Item { name: "waterproof overclothes", weight: 43, value: 75},
Item { name: "note-case", weight: 22, value: 80},
Item { name: "sunglasses", weight: 7, value: 20},
Item { name: "towel", weight: 18, value: 12},
Item { name: "socks", weight: 4, value: 50},
Item { name: "book", weight: 30, value: 10 },
];
let mut knapsack = KnapSack{ capacity: 400, current: 0, items: vec![]};
while let Some(item_ref) = take_highest_value_item(&items, knapsack.capacity - knapsack.current) {
knapsack.current += (*item_ref).weight;
knapsack.items.push(item_ref);
items
.iter()
.position(|&n| n == *item_ref)
.map(|e| items.remove(e));
}
println!("Items : {:?}", knapsack.items);
}
fn take_highest_value_item(items: &Vec<Item>, max_weight: u16) -> Option<&Item> {
items
.iter()
.fold(None, |acc, item_ref| {
if (*item_ref).weight > max_weight {
return acc;
}
match acc {
None =>
Some(item_ref),
Some(acc_item) =>
if acc_item.value > (*item_ref).value {
acc
} else {
Some(item_ref)
}
}
})
}
任何关于如何修复它的提示都将非常棒 是我试图解决的问题。函数
获取最高值\u item
借用items
并返回其中一项。您想将其从项目中删除,但要删除的项目是借阅未结束的原因。最简单的修复方法可能是更改函数获取最高值项目
,并从项目
中删除该函数中的项目。另请看,我很确定这个例子不是最小的。现在已经有几十个借用的问题了:这个问题与之前的问题有什么不同?谢谢@wimh,我已经试过了,但是因为我在一个循环中,编译器认为我同时使用了多个可变引用(&mut项)。