rust - 通过本地生命周期来满足特征
问题描述
我有一个通用函数创建一个本地对象并采用一个特征来指定如何处理该对象。trait 获取对象的引用并在其生命周期内保存它(以避免一次又一次地将它传递给每个函数调用)。它在
fn do_stuff<'a, T>()
where T : BigBorrower<'a>
{
let borrowee = Borrowed{ data : 1 };
{
let _borrowee = T::new(&borrowee);
}
}
这是函数调用。因为必须在函数声明中指定 trait 的生命周期,它使编译器认为生命周期延长了 _borrowee 的生命周期。
|
24 | fn do_stuff<'a, T>()
| -- lifetime `'a` defined here
...
29 | let _borrowee = T::new(&borrowee);
| -------^^^^^^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `borrowee` is borrowed for `'a`
30 | }
31 | }
| - `borrowee` dropped here while still borrowed
解决方案
您刚刚遇到了生命周期和编译器的问题之一。一旦你意识到它为什么会发生,这就是有道理的。
您的方法调用'a
为您提供的泛型类型强制执行生命周期。这意味着,除其他外,需要尊重这一生命周期,并且所有对象都必须活得那么久。实际上,当您这样做时,生命周期就是函数调用的生命周期。
通过传递T::new()
对局部变量的引用,您将强制编译器选择一个劣于的生命周期'a
(因为它不会超过函数调用),因此,您违背了自己的要求。
通常,您解决此问题的方法是将您do_stuff<'a, T>
分成两部分,就像在这个游乐场样本中一样。这使得编译器可以接受生命周期检查,因为该引用的预期寿命保证比被调用函数的预期寿命长。
请注意,我new
在 trait 和 implementations 中将您的方法重命名为borrow
,因为它更接近它的本质。
推荐阅读
- python - 如何在python中对字典的索引进行排序
- c++ - 使用 std::greater
- apache - 无效的数组索引在 php7 nginx phpfpm 配置中没有失败
- javascript - 如果我可以将文件路径保存在数据库中并将实际文件保存在存储中,为什么还要使用 Blob?
- python - 在 python 列表中对连续的相似项目进行分组
- vba - 如何使用 VBA 从 Internet Explorer 中的绘图/图形中提取信息
- python - 在交互式 Python 开发中,如何从另一个文件导入?
- java - 如何在 JPanel 中打印 JLabel 和 JTable 的值
- php - 显示链接到登录用户和自定义数据库电子邮件地址的数据
- sql - 日期转换为 int - 为什么它是错误的?