配列に要素を追加する関数(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
を書くための方法はありますか?あなたは、スライスパラメータに有効期間を指定する必要が
あなたのコードは非常に慣用的ではなく、すでに非常に簡単な操作のための 'unsafe'を使用しています。 ['Vec'](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html)について知っていますか? 'push()'のような便利なメソッドを持つ動的に割り当てられた配列です。ヒープを使用できない、または使用したくない場合は、スタック割り当て配列をラップし、多くの便利なメソッドを提供する 'arrayvec'を使用できます。あなたは確かにそういうことをしたくない... –
私はarrayvecについて知りませんでした。確かに私のコードを改善することができます。 – jeremiah