Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 一个结构字段的析构函数依赖于另一个,没有任何相关性_Rust_Lifetime - Fatal编程技术网

Rust 一个结构字段的析构函数依赖于另一个,没有任何相关性

Rust 一个结构字段的析构函数依赖于另一个,没有任何相关性,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

我试图制作一个简短的可重现的示例,但无法重现我的问题,因此我从保留错误的主代码中删除了大部分内容

lib.rs

外部板条箱程序宏;
使用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"