このエラーが発生しています - 「要件が競合しているため、自動強制の適切な有効期間を推測できません」。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
エラーを引き起こす私のコードのやや削除されたバージョン。概念的に、私がやろうとしているのは、Duty を参照する新しい Job を生成することです。ジョブは、義務の存続期間中のみ存在できます。義務がなくなると、仕事も同様になります。
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 () {
}