Rust 一个结构字段的析构函数依赖于另一个,没有任何相关性
我试图制作一个简短的可重现的示例,但无法重现我的问题,因此我从保留错误的主代码中删除了大部分内容 lib.rsRust 一个结构字段的析构函数依赖于另一个,没有任何相关性,rust,lifetime,Rust,Lifetime,我试图制作一个简短的可重现的示例,但无法重现我的问题,因此我从保留错误的主代码中删除了大部分内容 lib.rs 外部板条箱程序宏; 使用proc_macro::TokenStream; 使用quote::{quote}; 使用syn::{ 解析宏输入、数据、派生输入、字段、字段、标识、, 类型,类型泛型, }; 结构体映射{ iter:T, 映射函数:框Ret>, } 嵌入式映射{ pub fn new(iter:T,map_func:Box Ret>)->Self{ iter映射{iter,m
外部板条箱程序宏;
使用proc_macro::TokenStream;
使用quote::{quote};
使用syn::{
解析宏输入、数据、派生输入、字段、字段、标识、,
类型,类型泛型,
};
结构体映射{
iter:T,
映射函数:框Ret>,
}
嵌入式映射{
pub fn new(iter:T,map_func:Box Ret>)->Self{
iter映射{iter,map_func}
}
}
枚举构建器字段,syn::标点::Iter,syn::标点::Iter,
字段映射\u iter:IterMapped>,
}
☝️将BuilderData
更改为该值可以使代码正常工作
如果我重新排列结构字段的声明顺序并移动
让ref builder\u struct\u name=…
在设置字段iter
和字段映射iter
之前运行,因为这两个字段会在builder\u struct\u name
的临时值之前被删除。为什么它们的析构函数依赖于builder\u struct\u name
的temp?当作用域结束时,变量按声明顺序的相反顺序删除。因此,BuilderData
的生存期参数'a
不能扩展到builder\u struct\u name
被删除到字段映射的整个生存期时。然而,
要求其类型参数T
在其
生命周期参数'a
这是一个非常精简的版本。希望我没有减少太多。我甚至猜不出为什么会发生这个错误。更有趣的是,如果你取出格式,你的完整示例就会编译!(…)
在使用变量之前将其转换为变量。“很奇怪!”kmdreko,是的,我也被这个弄糊涂了。这两个字段之间似乎没有任何相关性。仅仅是给他们同样的生命就让他们因为“某种”原因而相互依赖,我不明白。现在注意到,在格式处使用静态str!()
也可以编译代码。出于某种原因,fields\u-mapped\u-iter
取决于传递给ident的str片。另外,感谢这个简短的示例,这确实有助于测试更多。但是为什么fields\u-mapped\u-iter
不受struct\u-name
的影响呢?如果我从上述代码中完全删除builder\u struct\u name
,struct\u name
在类型和生存期方面仍然与builder\u struct\u name
具有相同的语义。但是在这种情况下,代码可以很好地编译。我尝试将struct\u name
移动到fields\u-mapped\u iter
之后,它仍然可以工作()。@Mihir:啊,是的,但是struct\u name
借用了deriver\u-input
,因此引用有它的生存期。它确实开始有一些意义,但是,在上面的代码中,syn::标点::Iter
的T是syn::Field
,它没有任何生存期参数。那么,syn::Field:'a
不包含任何引用,所以它不满足吗?引用T:'a意味着T的所有寿命参数都比“a”长
,在这种短的可再现性中,没有指定界限(T:'a),但错误仍然存在。
[package]
name = "derive_builder"
version = "0.0.0"
edition = "2018"
autotests = false
publish = false
[lib]
proc-macro = true
[dependencies]
syn = "1.0.48"
quote = "1.0.7"
proc-macro2 = "1.0.24"