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链接的问题的答案进行操作,它会工作),但是编译器推断您需要一个哈希集
,而您可能需要一个哈希集
。