我正在写一篇短文,以寻找使用std::borrow::Cow
可能有益的地方。这些地方可能包括局部变量,但也包括结构字段和枚举参数,除非它们是公共接口的一部分(此时我打算退出;我不想要求人们在此时更改官方接口)。
但是,要做到这一点,我们必须在报告之前检查整个板条箱的定义。由于LintPass
特性没有在遍历板条箱之后无条件调用的回调,所以我试图通过封装rustc_front::visit::Visitor
和我们的数据的visitor结构来实现rustc::lint::Context
。
此外,我想检查String
类型的字段,这些字段是从&'static str
中实例化的。为了实现这一点,我想在visitor结构中使用ExprUseVisitor
特性。
目前的代码是here。
我得到以下错误:
src/cow.rs:56:44: 56:48 error: cannot infer an appropriate lifetime for lifetime parameter `'v` due to conflicting requirements
src/cow.rs:56 let vis = euv::ExprUseVisitor::new(self as &mut euv::Delegate<'t>, &infcx);
^~~~
src/cow.rs:51:5: 58:6 help: consider using an explicit lifetime parameter as shown: fn visit_fn(&mut self, _: FnKind, fd: &FnDecl, b: &Block, _: Span, id: NodeId)
src/cow.rs:51 fn visit_fn(&mut self, _: FnKind, fd: &FnDecl, b: &Block,
src/cow.rs:52 _: Span, id: NodeId) {
src/cow.rs:53 let tcx = &self.cx.tcx;
src/cow.rs:54 let param_env = Some(ty::ParameterEnvironment::for_item(tcx, id));
src/cow.rs:55 let infcx = infer::new_infer_ctxt(tcx, &tcx.tables, param_env, false);
src/cow.rs:56 let vis = euv::ExprUseVisitor::new(self as &mut euv::Delegate<'t>, &infcx);
...
至少可以说,这个错误是相当令人惊讶的。注意,建议的“显式生存期”实际上与我的代码相同。
那我该如何编译我的代码呢?
最佳答案
问题在于euv::Delegate
的实现。具体来说,当您打算实现euv::Delegate<'v> for CowVisitor<'v, 't>
时,您尝试实现euv::Delegate<'t> for CowVisitor<'v, 't>
。
一般来说,如果你正在做一些与生命周期有关的复杂事情,那么错误消息几乎是无用的;不要相信它们实际上指向了错误。