如何返回引用了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> { /* ... */ }