gpt4 book ai didi

rust - 显式生命周期更改函数签名并使函数与所需的类型签名不兼容

转载 作者:行者123 更新时间:2023-11-29 08:08:39 25 4
gpt4 key购买 nike

#![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)。一定有更好的方法吗?

最佳答案

hir_visit::walk_crate(&mut visitor, visitor.map.krate());

解决方案是意识到 map 还包含一个 krate 作为引用,但具有正确的生命周期。这意味着我不必引入明确的生命周期。

playground

关于rust - 显式生命周期更改函数签名并使函数与所需的类型签名不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45936220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com