gpt4 book ai didi

rust - 在测试函数上声明生命周期

转载 作者:行者123 更新时间:2023-11-29 08:10:53 25 4
gpt4 key购买 nike

我正在进行一个无法编译的测试:

#[test]
fn node_cost_dequeue() {
let mut queue: BinaryHeap<&NodeCost> = BinaryHeap::new();
let cost_1: NodeCost = NodeCost::new(1, 50, 0);
let cost_2: NodeCost = NodeCost::new(2, 30, 0);
let cost_3: NodeCost = NodeCost::new(3, 80, 0);
queue.push(&cost_1);
queue.push(&cost_2);
queue.push(&cost_3);
assert_eq!(2, (*queue.pop().unwrap()).id);
}

导致 错误:cost_1 的生命周期不够长

附加信息“借入值(value)先于借款人下降”。

所以我尝试添加明确的生命周期注释。

#[test]
fn node_cost_dequeue() {
let mut queue: BinaryHeap<&'a NodeCost> = BinaryHeap::new();
let cost_1: NodeCost<'a> = NodeCost::new(1, 50, 0);
let cost_2: NodeCost<'a> = NodeCost::new(2, 30, 0);
let cost_3: NodeCost<'a> = NodeCost::new(3, 80, 0);
queue.push(&cost_1);
queue.push(&cost_2);
queue.push(&cost_3);
assert_eq!(2, (*queue.pop().unwrap()).id);
}

这导致使用未声明的生命周期名称“a”

所以,我尝试在函数上声明它

fn node_cost_dequeue<'a>() -> () {

但这会导致错误:用作测试的函数必须具有签名 fn() -> ()

我走在正确的轨道上吗?我如何宣告这一生?

最佳答案

这告诉你的是..

一切都以相反的顺序被丢弃.. cost_1 将在 queue 之前被丢弃.. 因为它在 queue 之后声明。所以 queue 有一个对 cost_1 的引用,因为这些值现在在方法的末尾被删除 queue 现在有一个对.. 。 没有什么? cost_1 已被删除,而 queue 仍然“活着”——尽管它也即将被删除。

需要明确的是,事件的顺序很重要,因为 BinaryHeap 实例正在存储引用。它不拥有其内容。

事件的顺序是:

  • 声明一个存储引用BinaryHeap实例。
  • 声明cost_1cost_2cost_3,它们的引用将被插入BinaryHeap
  • 将引用添加到 BinaryHeap
  • 执行断言。
  • 放下 cost_3
  • 放下 cost_2
  • 放下 cost_1
  • BinaryHeap 引用现在指向什么?元素掉落。
  • 删除 BinaryHeap

上面列表中的粗体项是编译器保护你免受的。可能无效的指针。

简单的解决方法是颠倒声明顺序,这样任何对 cost_1 的引用都比 queue 长:

let cost_1: NodeCost = NodeCost::new(1, 50, 0);
let cost_2: NodeCost = NodeCost::new(2, 30, 0);
let cost_3: NodeCost = NodeCost::new(3, 80, 0);
let mut queue: BinaryHeap<&NodeCost> = BinaryHeap::new();

这是一个有效的 example on the playground

现在事件的顺序是:

  • 声明cost_1cost_2cost_3,它们的引用将被插入BinaryHeap
  • 声明一个存储引用BinaryHeap实例。
  • 将引用添加到 BinaryHeap
  • 执行断言。
  • 删除 BinaryHeap引用可以消失,因为它们引用的项仍然存在。
  • 放下 cost_3
  • 放下 cost_2
  • 放下 cost_1

关于rust - 在测试函数上声明生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com