2017-03-12 7 views
0

配列に要素を追加する関数(f1)を作成しようとしています。ここで身体に定義されている生涯のaは、必ずしも身体に定義された匿名生涯#1よりも長生きするとは限りません。

は私の錆コードです:

use std::mem; 

struct T1<'a> { 
    value: &'a str, 
} 

fn main() { 
    let mut data: [T1; 1] = unsafe { mem::uninitialized() }; 
    f1("Hello", &mut data[..]); 
} 

fn f1<'b, 'a: 'b>(s: &'a str, data: &'b mut[T1]) { 
    data[0] = T1::<'a> { value: s }; 
} 

私は、このエラーメッセージが表示されます:

error[E0308]: mismatched types 
    --> <anon>:13:15 
    | 
13 |  data[0] = T1::<'a> { value: s }; 
    |    ^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch 
    | 
    = note: expected type `T1<'_>` 
    = note: found type `T1<'a>` 
note: the lifetime 'a as defined on the body at 12:49... 
    --> <anon>:12:50 
    | 
12 | fn f1<'b, 'a: 'b>(s: &'a str, data: &'b mut[T1]) { 
    | __________________________________________________^ starting here... 
13 | |  data[0] = T1::<'a> { value: s }; 
14 | | } 
    | |_^ ...ending here 
note: ...does not necessarily outlive the anonymous lifetime #1 defined on the body at 12:49 
    --> <anon>:12:50 
    | 
12 | fn f1<'b, 'a: 'b>(s: &'a str, data: &'b mut[T1]) { 
    | __________________________________________________^ starting here... 
13 | |  data[0] = T1::<'a> { value: s }; 
14 | | } 
    | |_^ ...ending here 
help: consider using an explicit lifetime parameter as shown: fn f1<'b, 'a:'b>(s: &'a str, data: &'b mut [T1<'a>]) 
    --> <anon>:12:1 
    | 
12 | fn f1<'b, 'a: 'b>(s: &'a str, data: &'b mut[T1]) { 
    | _^ starting here... 
13 | |  data[0] = T1::<'a> { value: s }; 
14 | | } 
    | |_^ ...ending here 

は、私が何をしようとしているんf1を書くための方法はありますか?あなたは、スライスパラメータに有効期間を指定する必要が

+1

あなたのコードは非常に慣用的ではなく、すでに非常に簡単な操作のための 'unsafe'を使用しています。 ['Vec '](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html)について知っていますか? 'push()'のような便利なメソッドを持つ動的に割り当てられた配列です。ヒープを使用できない、または使用したくない場合は、スタック割り当て配列をラップし、多くの便利なメソッドを提供する 'arrayvec'を使用できます。あなたは確かにそういうことをしたくない... –

+0

私はarrayvecについて知りませんでした。確かに私のコードを改善することができます。 – jeremiah

答えて

1

fn f1<'b, 'a: 'b>(s: &'a str, data: &'b mut [T1<'a>]) { 
    data[0] = T1::<'a> { value: s }; 
} 
+0

*ライフタイムパラメータを指定する必要がある理由を説明してください。 –

+1

これはすでに受け入れられています:生涯 '' b''を署名から削除することができ、 ':: <'a>'を本体から削除することができます。コンパイラは、これらの2つのことを推論することができます。 –

関連する問題