Rust 由于需求冲突,无法推断自动强制的适当生存期
我得到了这个错误——“由于需求冲突,无法推断自动强制的适当生存期”。然而,我已经尝试明确地强制执行Rust 由于需求冲突,无法推断自动强制的适当生存期,rust,borrow-checker,Rust,Borrow Checker,我得到了这个错误——“由于需求冲突,无法推断自动强制的适当生存期”。然而,我已经尝试明确地强制执行start\u 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> erro
start\u 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
<代码> >错误:RS:45∶:55∶2注释:考虑使用显式生命周期参数,如:fn StastRealTevice和DutyLealWork(职责:& dutyLealthCurvivices)->和'dutyLealsPosivi]
错误。rs:46
错误。rs:47设j:Job=Job{
错误。rs:48职责:职责,
错误。rs:49输出:“”。到_字符串(),
错误。rs:50成功:作业未完成
...
错误。rs:48:15:48:19错误:由于需求冲突,无法推断自动强制的适当生存期
错误。rs:48职责:职责,
^~~~
错误:由于上一个错误而中止
导致错误的代码的某种删除版本。从概念上讲,我试图做的是生成一个引用职责的新作业。作业只能在职责的生命周期内存在;当职责消失时,该作业也应该存在
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 () {
}
枚举源{
没什么,//没什么
Git(String,String),//reponame,refname
Hg(String,String),//reponame,csid
Url(字符串)//向下卷曲此处的内容
}
枚举作业结果{
作业未完成,
工作成功,
工作失败,
作业错误
}
/*
乔布斯
工作总是附加在产生它们的职责上;可能有
没有工作就没有责任,所以我们把责任作为终身的参照
*/
结构作业>,//可变,代理
}
//返回新作业,但引用了职责。
fn开始工作和终身工作{
让j:Job=Job{
职责:职责,,
输出:“.to_字符串(),
成功:未完成任务
};
return&j;
}
fn main(){
}
此函数签名承诺返回对作业的引用
fn start_duty<'dutylife> (duty: &'dutylife Duty) -> &'dutylife Job
还有另一个错误,代码试图返回对此函数中创建的作业的引用。我也修复了该错误,代码现在已编译。请告诉我您是否正试图执行此操作
编辑:回应“工作只能在职责的生命周期内存在;当职责消失时,工作也应该存在。”部分
这不能以您尝试过的方式完成,因为当函数结束时,作业对象将不再存在,对它的任何引用都将变得无效
最简单的方法是让
职责
拥有在其上工作的作业
(通过给它一个选项
或选项
字段)。这是一种单一所有者的方法。多个所有者要复杂得多,并且会涉及引用计数指针或原始指针。Hm,我试图返回一个引用,我不想到处传输副本(尽管tbh,不确定最终结果会是什么).我在考虑你的所有权评论。无论如何,我会去的,当我搞砸的时候,借书人会对我大喊大叫。:)
fn start_duty<'dutylife> (duty: &'dutylife Duty) -> Job<'dutylife> {
Job {
duty: duty,
output: "".to_string(),
success: JobNotDone
}
}