質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

1314閲覧

構造体内部に文字列の配列を保持するための、ライフタイム指定方法が知りたい

sutonea

総合スコア207

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2022/05/07 02:52

実現したいこと

構造体内部に保持した Vector<str> へ要素を追加するためのメソッドを作成したいです。
ライフタイムに関するエラーを解消する方法と、考え方をご教示いただきたく、よろしくお願いいたします。

  1. Memo というクラスを作成しました
  2. インスタンス変数に lines として 文字列の配列を定義しました(実装は Vector )
  3. lines に文字列を追加するための add メソッドを定義しました

クラス図

発生しているエラーメッセージ

error[E0261]: use of undeclared lifetime name `'a` --> src/main.rs:15:11 | 15 | impl Memo<'a> { | - ^^ undeclared lifetime | | | help: consider introducing lifetime `'a` here: `<'a>`

該当のソースコード

rust

1fn main() { 2 let mut text = Memo::new(); 3 text.add("name, category") 4 .add("Apple, Fruit") 5 .add("Beef, Meet") 6 .add("Banana, Fruit"); 7 8 println!("{:?}", text.data); 9} 10 11struct Memo<'a> { 12 data: Vec<&'a str>, 13} 14 15impl Memo<'a> { 16 fn new() -> Memo<'static> { 17 Memo { 18 data: vec![], 19 } 20 } 21 22 fn add<'a>(&mut self, line: &'a str) -> &mut Memo { 23 self.data.push(line); 24 self 25 } 26}

Cargo.toml

[package] name = "docfood" version = "0.1.0" edition = "2021"

試したこととエラーメッセージ

impl Memo からライフタイムの指定を除外してみました。

error[E0726]: implicit elided lifetime not allowed here --> src/main.rs:15:6 | 15 | impl Memo { | ^^^^- help: indicate the anonymous lifetime: `<'_>` | = note: assuming a `'static` lifetime...

impl Memo<'_> としてみました。

error[E0312]: lifetime of reference outlives lifetime of borrowed content... --> src/main.rs:23:25 | 23 | self.lines.push(line); | ^^^^ | note: ...the reference is valid for the lifetime `'_` as defined here... --> src/main.rs:15:11 | 15 | impl Memo<'_> { | ^^ note: ...but the borrowed content is only valid for the lifetime `'a` as defined here --> src/main.rs:22:12 | 22 | fn add<'a>(&mut self, line: &'a str) -> &mut Memo { | ^^

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論から言えばこういう感じです。

rust

1fn main() { 2 let mut text = Memo::new(); 3 text.add("name, category") 4 .add("Apple, Fruit") 5 .add("Beef, Meet") 6 .add("Banana, Fruit"); 7 8 println!("{:?}", text.data); 9} 10 11struct Memo<'a> { 12 data: Vec<&'a str>, 13} 14 15impl<'a> Memo<'a> { 16 fn new() -> Memo<'a> { 17 Memo { data: vec![] } 18 } 19 20 fn add(&mut self, line: &'a str) -> &mut Self { 21 self.data.push(line); 22 self 23 } 24}

add の引数 str についてはどことも関連付いていない寿命 'a を指定しても何の役にも立ちません。 この 'aMemo より寿命が長いことを意味する 'a でなければなりません。

投稿2022/05/07 04:46

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sutonea

2022/05/07 09:33

`impl` にも `'a` が必要なのですね。ご教示ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問