gpt4 book ai didi

rust - 由于需求冲突,无法推断出自动强制的适当生命周期

转载 作者:行者123 更新时间:2023-11-29 08:30:34 26 4
gpt4 key购买 nike

我收到此错误 - “由于需求冲突,无法推断自动强制转换的适当生命周期”。但是,我已尝试明确执行 start_duty 要求。

error.rs:45:1: 55:2 note: consider using an explicit lifetime parameter as shown: fn start_duty<'dutylife>(duty: &'dutylife Duty) -> &'dutylife Job<'dutylife>
error.rs:45 fn start_duty<'dutylife> (duty: &'dutylife Duty) -> &'dutylife Job {
error.rs:46
error.rs:47 let j : Job = Job {
error.rs:48 duty: duty,
error.rs:49 output: "".to_string(),
error.rs:50 success: JobNotDone
...
error.rs:48:15: 48:19 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements
error.rs:48 duty: duty,
^~~~
error: aborting due to previous error

我的代码的一个略微删除的版本导致了错误。从概念上讲,我想要做的是生成一个引用职责的新工作。职位只能在职责的生命周期内存在;当职责消失时,工作也应该消失。

enum Source {
Nothing, // Nothing
Git(String, String), // reponame, refname
Hg(String, String), // reponame, csid
Url(String) // curl down what's here
}

enum JobResult {
JobNotDone,
JobSuccess,
JobFailure,
JobError
}

/*
Jobs

Jobs are always attached to the Duty that spawned them; there can be
no Job without the duty. So we take a lifetime param of the duty reference
*/
struct Job<'r> {
duty: &'r Duty, // pointer back to
output: String, // no output = ""
success: JobResult
}

enum Action {
BashScript(String)
}

struct Duty {
name: String,
source: Source,
action: Action,
comment: Option<String>
}

struct Agent<'r> {
hostname : String,
uid : u64,
job : Option<Job<'r>>, // mutable, agents
}

// returns new Job, but with duty referenced.
fn start_duty<'dutylife> (duty: &'dutylife Duty) -> &'dutylife Job {

let j : Job = Job {
duty: duty,
output: "".to_string(),
success: JobNotDone

};

return &j;
}


fn main () {
}

最佳答案

此函数签名 promise 返回对作业的引用。

fn start_duty<'dutylife> (duty: &'dutylife Duty) -> &'dutylife Job

您可能想要做的是返回一个 Job包含对 Duty 的引用:

fn start_duty<'dutylife> (duty: &'dutylife Duty) -> Job<'dutylife> {

Job {
duty: duty,
output: "".to_string(),
success: JobNotDone
}

}

还有另一个错误,代码试图返回一个对该函数中创建的作业的引用。我也修复了这个问题,现在代码可以编译了。让我知道这是否是您想要做的。

编辑:回应“工作只能在 Duty 的生命周期内存在;当 Duty 消失时,Job 也应该如此。”部分。

这不能以您尝试过的方式完成,因为当函数结束时 Job 对象将不复存在,并且对它的任何引用都将变得无效。

最简单的方法是让 Duty拥有 Job (s) 处理它(通过给它一个 Option<Job>Option<Vec<Job>> 字段)。这是单一所有者的方法。多个所有者要复杂得多,并且会涉及引用计数指针或原始指针。

关于rust - 由于需求冲突,无法推断出自动强制的适当生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com