【问题标题】:Explicit lifetimes change the function signature and make the function incompatible for the required type signature显式生命周期会更改函数签名并使函数与所需的类型签名不兼容
【发布时间】:2017-08-29 10:03:46
【问题描述】:
#![feature(rustc_private)]
#![feature(box_syntax)]
extern crate rustc;
extern crate rustc_driver;

use rustc::hir::intravisit as hir_visit;
use rustc::hir;
use rustc_driver::driver::{CompileController, CompileState};

pub struct SomeVisitor<'a, 'tcx: 'a> {
    pub map: &'a hir::map::Map<'tcx>,
}

impl<'v, 'tcx: 'v> rustc::hir::intravisit::Visitor<'tcx> for SomeVisitor<'v, 'tcx> {
    fn nested_visit_map<'this>(&'this mut self) -> hir_visit::NestedVisitorMap<'this, 'tcx> {
        hir_visit::NestedVisitorMap::All(self.map)
    }
}

fn hir(s: &mut CompileState) {
    let krate = s.hir_crate.unwrap();
    let map = s.hir_map.unwrap();
    let mut visitor = SomeVisitor { map };
    hir_visit::walk_crate(&mut visitor, krate);
}

fn main() {
    {
        let mut controller = CompileController::basic();
        controller.after_hir_lowering.callback = box hir;
    }
}

playground

我明白为什么会出现生命周期错误,并且通过为函数 hir 添加显式生命周期很容易解决它。

pub fn walk_crate<'v, V: hir_visit::Visitor<'v>>(visitor: &mut V, krate: &'v Crate) {}

由于这个定义,引用的生命周期需要为 'tcx 生存。

fn hir<'v, 'tcx>(s: &'tcx mut CompileState<'v, 'tcx>) {
    let krate = s.hir_crate.unwrap();
    let map = s.hir_map.unwrap();
    let mut visitor = SomeVisitor { map };
    hir_visit::walk_crate(&mut visitor, krate);
}

但随后函数hir 变得与回调不兼容。 playground

我假设我可能需要在这里使用HRTB

更新:

我目前的解决方法是使用 transmute。 (playground)。肯定有更好的方法吗?

【问题讨论】:

    标签: rust


    【解决方案1】:
    hir_visit::walk_crate(&mut visitor, visitor.map.krate());
    

    解决方案是意识到该地图还包含一个 krate 作为参考,但具有正确的生命周期。这意味着我不必引入显式生命周期。

    playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多