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
    一样长。