Rust 你能控制借用结构还是借用字段吗?
我正在开发一个涉及结构的程序,其思路如下:Rust 你能控制借用结构还是借用字段吗?,rust,borrow-checker,Rust,Borrow Checker,我正在开发一个涉及结构的程序,其思路如下: struct App { data: Vec<u8>, overlay: Vec<(usize, Vec<u8>)>, sink: Sink, } 我已经实现了一个迭代器来合并数据和覆盖中的信息,供接收器使用 结构合并器{ 数据:&'Vec, 叠加:&'b向量, //迭代器状态等。 } MergeIter的impl迭代器{ 类型项=&'a[u8]; // ... } 我认为这是一个小小的谎
struct App {
data: Vec<u8>,
overlay: Vec<(usize, Vec<u8>)>,
sink: Sink,
}
我已经实现了一个迭代器来合并数据
和覆盖
中的信息,供接收器
使用
结构合并器{
数据:&'Vec,
叠加:&'b向量,
//迭代器状态等。
}
MergeIter的impl迭代器{
类型项=&'a[u8];
// ...
}
我认为这是一个小小的谎言,因为迭代器返回的每个&[u8]的生存期并不总是原始数据的生存期。从overlay
插入的数据具有不同的生存期,但我不知道如何更准确地对其进行注释。无论如何,借阅检查器似乎并不介意-以下方法有效:
fn merge(data:&'a-Vec,overlay:&'b-Vec,start:usize)->Vec(&'a-self,start:usize)->Vec-Vec-Vec-Vec只要方法merge
采用&self
,您就无法实现您想要的目标:它借用了它的所有参数,这是无法更改的
解决方案是对其进行更改,使其不采用self
,而是采用希望借用的各个字段:
impl应用程序{
...
fn合并(数据:&Vec,覆盖:&Vec,开始:usize)->Vec{
MergeIter::new(数据、覆盖、开始).collect()
}
fn流程(&mut-self){
让merged=Self::merge(&Self.data,&Self.overlay,0);
…//检查“合并”的内容
self.sink.process(合并);
}
}
是的,您猜对了-发生错误是因为当您使用merge
方法accept&self
时,编译器无法在其调用站点知道它只使用了一些字段-merge
签名只告诉它返回的数据以某种方式来自self
,但是它并没有告诉你怎么做——因此编译器假设“最坏”的情况,并阻止你访问self的其他字段
恐怕目前没有办法解决这个问题,我也不确定将来是否会有。但是,您可以使用宏来缩短merge
调用:
macro\u规则!合并{
($this:ident,$start:expr)=>{
MergeIter::new(&$this.data,&$this.overlay,$start).collect()
}
}
fn流程(&mut-self){
让合并=合并!(self,0);
//检查“合并”的内容
self.sink.process(合并);
}
您上次的尝试是不正确的-您本质上是说'a
可以是调用方选择的任意生存期,因此它也可以选择'static
。但是您的代码不会返回具有静态生存期的引用,而是返回生存期为self.data
的引用。这是不可能的,所以这样的签名被认为是不可靠的。顺便说一句,编译器通常显示冲突的需求——它突出显示与冲突生存期相关联的作用域。您的问题的其余部分需要更多的研究。&Vec
可以通过将其更改为&T]
来提高一点效率&Vec
也将自动强制执行&[T]
,因此使用它不会增加负担。@Vladimitmaveev我已经看到一些生命周期错误的作用域高亮显示,但在这种特殊情况下没有。这让事情变得更加令人沮丧:PI还没有研究过生锈的宏——我想是时候研究一下了!哎呀,&self.data
和&self.overlay
显然应该是数据
和overlay
。