0

このエラーが発生しています - 「要件が競合しているため、自動強制の適切な有効期間を推測できません」。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 () {
}
4

1 に答える 1

2

この関数シグネチャは、ジョブへの参照を返すことを約束します。

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

おそらくやりたかったJobことは、 a への参照を含む a を返すことでしたDuty:

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

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

}

別のエラーもありました。コードは、この関数で作成されたジョブへの参照を返そうとしていました。私もそれを修正し、コードがコンパイルされるようになりました。これがあなたがやろうとしていたことかどうか教えてください。

編集:「ジョブは義務の存続期間中のみ存在できます。義務がなくなると、ジョブも同様に存在する必要があります。」に対応する。部。

関数が終了すると Job オブジェクトが存在しなくなり、それへの参照が無効になるため、これはあなたが試した方法では実行できません。

最も簡単な方法は、(またはフィールドを与えることによって)Duty自分自身に作業させることです。これは、単一所有者のアプローチです。複数の所有者は非常に複雑で、参照カウント ポインターまたは生のポインターが含まれます。JobOption<Job>Option<Vec<Job>>

于 2014-06-08T19:02:35.070 に答える