代码之家  ›  专栏  ›  技术社区  ›  Maik Klein

显式生存期更改函数签名,并使函数与所需的类型签名不兼容

  •  2
  • Maik Klein  · 技术社区  · 8 年前
    #![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

    更新:

    playground

    1 回复  |  直到 8 年前
        1
  •  1
  •   Maik Klein    8 年前
    hir_visit::walk_crate(&mut visitor, visitor.map.krate());
    

    playground

    推荐文章