我收到以下生命周期错误:
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> prusti-viper/src/procedures_table.rs:42:40
|
42 | let mut cfg = self.cfg_factory.new_cfg_method(
| ^^^^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 40:5...
--> prusti-viper/src/procedures_table.rs:40:5
|
40 | / pub fn set_used(&mut self, proc_def_id: ProcedureDefId) {
41 | | let procedure = self.env.get_procedure(proc_def_id);
42 | | let mut cfg = self.cfg_factory.new_cfg_method(
43 | | // method name
... |
135| | self.procedures.insert(proc_def_id, method);
136| | }
| |_____^
note: ...so that reference does not outlive borrowed content
--> prusti-viper/src/procedures_table.rs:42:23
|
42 | let mut cfg = self.cfg_factory.new_cfg_method(
| ^^^^^^^^^^^^^^^^
note: but, the lifetime must be valid for the lifetime 'v as defined on the impl at 22:1...
--> prusti-viper/src/procedures_table.rs:22:1
|
22 | impl<'v, P: Procedure> ProceduresTable<'v, P> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: ...so that the expression is assignable:
expected viper::Method<'v>
found viper::Method<'_>
error: aborting due to previous error
无需查看代码,只需阅读错误消息,是否可以了解哪些生命周期/引用/借用是指错误消息?这是用我的问题注释的消息:
错误[E0495]:无法推断autoref的适当生命周期(什么是autoref?)由于需求冲突注意:首先,生命周期(生命周期?)不能超过匿名生命#1(&mut self,ok)在方法体上定义为40:5 ......以便引用(哪个引用?)不会比借来的内容(借用内容?)更长,但是,生命周期必须对生命周期'v有效 . 以22:1的比例...(为什么这些限制?)
例如,我正在寻找一个解释,如“在错误消息E0495中,不能超过匿名生命的生命期#1始终是 self
的生命周期,换句话说,#1再次” .
通过查看类似问题的现有答案(https://stackoverflow.com/a/35519236/2491528,https://stackoverflow.com/a/30869059/2491528,https://stackoverflow.com/a/41271422/2491528),我找不到错误消息所指的解释 . 有时答案只写“在这种情况下,生命周期是 'a
”,但我'm wondering how to understand that it' s 'a
而不是其他一些 'b
. 其他时候答案涉及对源代码的推理,但这对我来说将是以下步骤之一:首先阅读消息并理解它所指的是什么,然后理解错误(在这种情况下,可能是冲突的生命周期要求) ,然后查看代码并尝试修复错误 .
1 回答
这是错误的关键部分 . 一生中有两个(或更多)要求,它们会发生冲突 . "autoref"表示通过调用带有
&self
的方法所引用的引用 . 引用的代码行指示哪个方法调用是错误的 .这是第一个相互冲突的要求 . "The lifetime"表示第一条消息中引用的那个:它's trying to infer, for this autoref. It can't比你借用的对象更长的那个是该方法的成员
&mut self
.这只是进一步解释了 . "That reference" - 自动编辑're trying to take - can'比
&mut self
引用的对象更长 .这里的“但”引入了第二个要求,它与第一个要求相冲突 .
你问“为什么这些约束?”,编译器马上解释:
有问题的作业是错误行中的作业 . 您将
new_cfg_method
的结果分配给cfg
. "expected"是赋值的左侧cfg
,其类型必须为viper::Method<'v>
. "found"是右侧,是方法调用的结果,类型为viper::Method<'_>
.'_
表示编译器尝试推断的生命周期 . 也就是说,这是你随后使用cfg
的方式,这意味着它必须具有生命周期'v
. 为什么这取决于错误消息中未引用的代码 .要解决此问题,您需要执行以下操作之一:
删除第一个要求 . 更改
new_cfg_method
,以便其结果的生命周期与您调用它的对象的生命周期无关:可能通过删除它包含的一些引用 .删除第二个要求 . 更改使用
cfg
的代码,因此它不需要具有生命周期'v
. 同样,这可以通过删除viper::Method
中的一些引用来实现 .如果你不能这样做,你可能需要引入
Cell
或其他东西来动态地管理生命周期而不是静态管理生命周期 .