首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建既是访问者又是LintPass的ExprUseVisitor?

如何创建既是访问者又是LintPass的ExprUseVisitor?
EN

Stack Overflow用户
提问于 2015-09-16 13:15:24
回答 1查看 55关注 0票数 2

我目前正在写一篇文章,以寻找使用std::borrow::Cow可能是有益的地方。这些地方可能包括局部变量,但也包括结构字段和枚举参数,除非它们是公共接口的一部分(此时我打算放弃;我不想要求人们在此时更改官方接口)。

然而,要做到这一点,我们必须在报告之前检查整个机箱的定义。由于LintPass特性在板条箱被移动后没有无条件调用的回调,所以我试图通过封装rustc::lint::Context和数据的自己的访问者结构来实现rustc_front::visit::Visitor

此外,我想检查String类型的字段,这些字段是从&'static str实例化的。为了实现这一点,我想在访问者结构中使用ExprUseVisitor特性。

现在的代码是这里

我得到以下错误:

代码语言:javascript
复制
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);
              ...

至少可以说,这个错误是相当令人吃惊的。请注意,建议的“显式生存期”实际上与我的代码相同。

那么,如何让我的代码编译呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 23:44:22

问题在于euv::Delegate的实现。具体来说,当您打算实现euv::Delegate<'v> for CowVisitor<'v, 't>时,您尝试实现euv::Delegate<'t> for CowVisitor<'v, 't>

通常情况下,如果您做的是与生命周期有关的复杂操作,那么错误消息几乎是无用的;不要相信它们实际上是指向错误的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32609686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档