如何将Handlebars注册表保存为结构体成员复用?解决生命周期报错
解决Handlebars实例存入AppState的生命周期问题
在Handlebars 4.3.6版本中,Handlebars结构体本身带有生命周期参数(Handlebars<'reg>),这就是你直接写registry: Handlebars时编译器报错“missing lifetime specifier”的原因。你不需要使用私有内部的Registry模块,也不需要持有引用,正确的做法是让AppState直接拥有Handlebars实例,并正确处理生命周期:
方案1:让结构体与Handlebars生命周期绑定
定义结构体时带上生命周期参数,匹配Handlebars的生命周期:
struct AppState<'a> { pool: Pool, registry: Handlebars<'a>, }
初始化时直接将创建好的Handlebars实例存入:
let mut registry = Handlebars::new(); // 在这里完成模板注册等操作 let app_state = AppState { pool: your_pool_instance, registry, };
方案2:使用静态生命周期(推荐)
如果你的模板注册没有依赖非静态的外部数据,Handlebars实例可以使用'static生命周期,这样结构体不需要带生命周期参数:
struct AppState { pool: Pool, registry: Handlebars<'static>, }
初始化时指定类型为Handlebars<'static>:
let mut registry: Handlebars<'static> = Handlebars::new(); // 注册模板 let app_state = AppState { pool: your_pool_instance, registry, };
为什么之前的引用方式不对
你尝试的registry: &'a Handlebars是持有一个Handlebars实例的引用,这会让AppState依赖外部实例的生命周期,增加复杂度。而我们的需求是复用注册表,让AppState直接拥有这个实例才是更合理的设计,也避免了生命周期依赖问题。
内容的提问来源于stack exchange,提问作者jinreal
相关产品推荐
相关产品推荐

