如何返回引用了Rust中self的结构?
我有一个如何返回引用了Rust中self的结构?,rust,Rust,我有一个struct,它有一个crontab条目列表,每个条目都知道自己的重复(例如crontab中的*/5****): 我正试图在Crontab上编写一个函数,以获取下一个将运行的条目 impl{ fn下次运行(&self,from:NaiveDateTime)->运行{ 条目:&'a条目{ |----预期的“运行” | =注意:应为'Run'类型` 我尝试过的类似变体无法使用“无法移出借用内容”等消息进行编译(如果将返回类型更改为中所述的&Run,则无法在函数中创建值并返回对它的引用。迭代
struct
,它有一个crontab条目列表,每个条目都知道自己的重复(例如crontab中的*/5****
):
我正试图在Crontab
上编写一个函数,以获取下一个将运行的条目
impl{
fn下次运行(&self,from:NaiveDateTime)->运行{
条目:&'a条目{
|----预期的“运行”
|
=注意:应为'Run'类型`
我尝试过的类似变体无法使用“无法移出借用内容”等消息进行编译(如果将返回类型更改为中所述的&Run,则无法在函数中创建值并返回对它的引用。迭代器链的结果将不归任何内容所有,因此引用将指向无效数据
这甚至无关紧要:正如评论中所指出的,您不能在self.entries
上调用进入iter
,因为您不能从借用的内容中移出,如中所述。这意味着我们不能将条目的自有值作为迭代器链的结果
Crontab
拥有条目
;只要Crontab
移动,对任何条目
的任何引用都将无效。这意味着任何引用都需要与self
的寿命挂钩;通用寿命'a
无法发挥作用:
fn next_run(&self, from: NaiveDateTime) -> Run {
self.entries
.iter()
.map(|entry| Run {
entry,
datetime: entry.recurrence.next_match(from),
})
.min_by(|this, other| this.datetime.cmp(&other.datetime))
.unwrap()
}
或显式版本:
fn next_run<'b>(&'b self, from: NaiveDateTime) -> Run<'b> { /* ... */ }
fn下一步\u run也许你可以先阅读,然后再回答你的问题来解释它的不同之处?我没有试过编译(请把你的错误贴出来),但似乎马上就错了的是.into\u iter()
。该调用使用原始值。如果您希望在迭代后条目
仍然存在,您希望迭代引用。@Shepmaster至少不同之处在于,我传递了一个对我希望响应引用的对象的引用,&self
。太棒了!关于移出引用的错误帐篷指向self.entries
行,因此我认为它与into\iter
调用无关。
impl<'a> Crontab<'a> {
fn next_run(&self, from: NaiveDateTime) -> Run<'a> {
&self.entries
.into_iter()
.map(|entry| Run {
entry: &entry,
datetime: entry.recurrence.next_match(from),
})
.min_by(|this, other| this.datetime.cmp(&other.datetime))
.unwrap()
}
}
struct Run<'a> {
entry: &'a Entry<'a>,
datetime: NaiveDateTime,
}
fn next_run(&self, from: NaiveDateTime) -> Run {
self.entries
.iter()
.map(|entry| Run {
entry,
datetime: entry.recurrence.next_match(from),
})
.min_by(|this, other| this.datetime.cmp(&other.datetime))
.unwrap()
}
fn next_run<'b>(&'b self, from: NaiveDateTime) -> Run<'b> { /* ... */ }