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_Borrow Checker - Fatal编程技术网

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