Rust 将对变量的引用插入HashSet,然后再使用变量

Rust 将对变量的引用插入HashSet,然后再使用变量,rust,Rust,在检查变量对是否已经存在后,我正在尝试将变量对插入到哈希集中。然后,我需要在相同的上下文中对这对进行下游工作。这是一个重现我问题的游乐场: error[E0597]:借入值的有效期不够长 -->src/main.rs:10:15 | 10 | h.插入(&a&b)); |^^^^^^^^^^-仍在借用时将临时值放在此处 | | |临时值的寿命不够长 11 | } |-临时价值需要持续到此处 | =注意:考虑使用“让”绑定来增加其生命周期。 错误[E0597]:`a`

在检查变量对是否已经存在后,我正在尝试将变量对插入到
哈希集中。然后,我需要在相同的上下文中对这对进行下游工作。这是一个重现我问题的游乐场:

error[E0597]:借入值的有效期不够长
-->src/main.rs:10:15
|
10 | h.插入(&a&b));
|^^^^^^^^^^-仍在借用时将临时值放在此处
|               |
|临时值的寿命不够长
11 | }
|-临时价值需要持续到此处
|
=注意:考虑使用“让”绑定来增加其生命周期。
错误[E0597]:`a`寿命不够长
-->src/main.rs:10:17
|
10 | h.插入(&a&b));
|^借来的价值不够长久
11 | }
|——‘a’在借的时候掉在这里了
|
=注意:范围中的值按与创建顺序相反的顺序删除
错误[E0597]:`b`寿命不够长
-->src/main.rs:10:21
|
10 | h.插入(&a&b));
|^借来的价值不够长久
11 | }
|——‘b’在借的时候掉在这里了
|
=注意:范围中的值按与创建顺序相反的顺序删除
如何检查
a
b
是否在集合中,如果不在集合中,如何在其后插入它们,然后对它们执行其他操作?如果我在同一范围内加载对它们的引用,它们是如何被借用的?

暂且不谈“为什么”,下面的示例有三个问题:

  • 一旦函数调用结束,元组
    &(…)
    就不再存在。因此,插入对某个一旦
    HashSet::insert
    返回就不存在的东西的引用是一个错误,而且编译器幸运地捕捉到了这个错误

  • 您在要引用的变量之前声明了
    HashSet
    ,编译器将其视为错误(可能是因为在
    HashSet
    的作用域中的某个点上,变量
    a
    b
    不存在)。这是我在很多场合被烧掉的东西,在编译器改进之前,您应该记住这一限制

  • 如上所述,
    HashSet
    s在插入时采用
    T
    ,在访问时采用
    &T
    。您的代码同时使用
    T

  • 以下代码修复了这些问题:

    use std::collections::HashSet;
    
    fn main() {
        let a = 1;
        let b = 2;
        let mut h = HashSet::new();
        if h.contains(&(&a, &b)) {
            println!("fail");
        }
        h.insert((&a, &b));
    }
    

    比较声明
    哈希集的行,插入元组。

    将“为什么”放在一边,下面的示例有三个问题:

  • 一旦函数调用结束,元组
    &(…)
    就不再存在。因此,插入对某个一旦
    HashSet::insert
    返回就不存在的东西的引用是一个错误,而且编译器幸运地捕捉到了这个错误

  • 您在要引用的变量之前声明了
    HashSet
    ,编译器将其视为错误(可能是因为在
    HashSet
    的作用域中的某个点上,变量
    a
    b
    不存在)。这是我在很多场合被烧掉的东西,在编译器改进之前,您应该记住这一限制

  • 如上所述,
    HashSet
    s在插入时采用
    T
    ,在访问时采用
    &T
    。您的代码同时使用
    T

  • 以下代码修复了这些问题:

    use std::collections::HashSet;
    
    fn main() {
        let a = 1;
        let b = 2;
        let mut h = HashSet::new();
        if h.contains(&(&a, &b)) {
            println!("fail");
        }
        h.insert((&a, &b));
    }
    


    比较声明哈希集的行,插入元组。

    您的值实际上是整数吗?如果是这样的话,那么一开始不使用引用似乎会更好。e、 g.如果我加载对它们的引用,它们是如何被借用的——这就是借用的含义:引用一个值。也许你可以将你的问题扩展到错误消息的哪一部分?“作用域中的值按创建它们的相反顺序被删除”对我来说很清楚。我相信您的问题已经由的答案回答了。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。
    h.contains(&(&a,&b))
    h.insert(&(&a,&b))
    的组合是可疑的。通常,您会使用
    T
    调用
    insert
    ,而
    contains
    引用-
    T
    。它仍然按照您编写它的方式工作(如果您按照Shepmaster链接的问题的答案进行操作,它会工作),但是编译器推断您需要一个
    哈希集
    ,而您可能需要一个
    哈希集
    。(或者如果loganfsmyth是正确的,那么您真的需要
    HashSet
    并且根本不需要引用。)您的值实际上是整数吗?如果是这样的话,那么一开始不使用引用似乎会更好。e、 g.如果我加载对它们的引用,它们是如何被借用的——这就是借用的含义:引用一个值。也许你可以将你的问题扩展到错误消息的哪一部分?“作用域中的值按创建它们的相反顺序被删除”对我来说很清楚。我相信您的问题已经由的答案回答了。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。
    h.contains(&(&a,&b))
    h.insert(&(&a,&b))
    的组合是可疑的。通常,您会使用
    T
    调用
    insert
    ,而
    contains
    引用-
    T
    。它仍然按照您编写它的方式工作(如果您按照Shepmaster链接的问题的答案进行操作,它会工作),但是编译器推断您需要一个
    哈希集
    ,而您可能需要一个
    哈希集