Rust 闭包内容器对象的生存期推断
我有一个例程,它处理容器中的对象,并引用存储在另外两个容器中的对象。Rust 闭包内容器对象的生存期推断,rust,closures,lifetime,inference,Rust,Closures,Lifetime,Inference,我有一个例程,它处理容器中的对象,并引用存储在另外两个容器中的对象。 然而,我并没有找到做这件事的可靠方法,终生的推断似乎禁止了这件事,我不知道如何解决它 fn main() { let mut deck : Deck = Deck::new(); let mut p1 : Hand = Hand::new(); let mut p2 : Hand = Hand::new(); do_hands(|data: &[Card]| -> Result
然而,我并没有找到做这件事的可靠方法,终生的推断似乎禁止了这件事,我不知道如何解决它
fn main() {
let mut deck : Deck = Deck::new();
let mut p1 : Hand = Hand::new();
let mut p2 : Hand = Hand::new();
do_hands(|data: &[Card]| -> Result<(),()> {
for card in data {
deck.insert(card.id, CardCell::new(*card));
let card: &CardCell = deck.get_mut(&card.id).unwrap();
handle_hand(&mut card, &mut p1, &mut p2);
}
return Ok(());
});
}
fn main(){
让mut deck:deck=deck::new();
让mut p1:Hand=Hand::new();
让mut p2:Hand=Hand::new();
手(|数据:&[Card]|->结果{
用于数据中的卡{
卡片组。插入(card.id,CardCell::new(*卡片));
let card:&CardCell=deck.get_mut(&card.id).unwrap();
手柄(多张卡,多张p1,多张p2);;
}
返回Ok(());
});
}
下面是完整的游乐场链接:我在游乐场中玩了这个示例,并设法获得了要编译的代码,但做了以下更改:
handle\u hand的签名
最初的签名是fn handle\u hand)
,但这就是编译器错误的原因。此签名要求handle\u hand
的所有输入具有相同的生存期,但在您的代码中并非如此。在封盖内部,卡
的寿命明显短于p1
和p2
。因此,修改后的签名变成:fn handle\u hand(\u card:&b mut CardCell,\u p1:&mut hand)
卡的签名
由于handle\u hand
需要&mut CardCell
,因此必须将卡声明为let mut card:&mut CardCell=…
卡
结构中。我把它放在最后,因为这可能需要根据您进一步编写结构的方式进行更改。但是在这一点上,它只是一个u64
的包装器,您可以简单地在它上面执行#[派生(克隆,复制)]
。这是必需的,因为您使用的单元格
结构。派生在这里工作,因为您的所有结构字段都已经实现了复制类型谢谢,我已经尝试过了,但是在我做的时候,它阻止了我把CARCULL引用存储到P1或P2中,考虑到:AHA,我不认为引用<代码>卡> <代码>可以存储在<代码> P1<代码>或<代码> P2 < /代码>中,因为“代码>卡具有比<代码> P1<代码> /<代码> P2 < /代码>短的寿命。因为它是在闭包内创建的。换句话说,您可能需要在闭包外创建
卡
;这样它的生命周期就与p1
/p2
.hmm相同,所以我可能需要更改代码的工作方式,我无法在闭包外创建卡,因为我需要闭包的参数来创建卡n将其存储在容器中,然后,实际上,可能会稍微更改它,然后将其存储在p1或p2中。我确实这样认为。我更改了句柄卡
签名,以便在当前设置下工作:在闭包内创建卡。但是,如果您确实打算推回p1
/p2
,则卡必须是cre以另一种方式进行加密,确保其引用寿命与p1
/p2
一样长。