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

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

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

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

Q&A

解決済

1回答

450閲覧

Rustのライフタイムがわからない

super_omega_max

総合スコア18

Rust

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

0グッド

1クリップ

投稿2024/08/17 10:54

実現したいこと

メソッドの戻り値をライフタイムの制約なしの状態で受け取りたい。

発生している問題・分からないこと

後述のメソッドgについてselfと同じライフタイムにしないとエラーが出てしまいます。

エラーメッセージ

error

1the associated type `<Self as X>::T` may not live long enough

該当のソースコード

Rust

1trait X { 2 type T: Y; 3 fn f(&self) -> Self::T; 4 fn g<'a>(&'a self) -> Box<dyn Y + 'a> { 5 Box::new(self.f()) as Box<dyn Y + 'a> 6 } 7} 8trait Y {} 9 10struct A; 11 12impl X for A { 13 type T = A; 14 fn f(&self) -> Self::T { 15 A 16 } 17} 18 19impl Y for A {} 20

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

動的ディスパッチやライフタイムに関する情報を検索しましたが見つかりませんでした。

補足

そもそもライフタイムの制約が必要になる理由がよくわかっていないので、その解説もお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問者がやったような self のライフタイムに合わせる方法だと self より長いライフタイムを持つことが出来ません。 質問者の意図としては self と寿命を切り離すことだと思うので誤った解決方法です。

rust

1// こういう使い方が出来ない。 2fn main() { 3 let _ = { 4 let foo = A {}; 5 foo.g() 6 }; 7}

ライフタイム注釈を書かない場合にも一定の規則で補われます。 デフォルトの規則でなんらかのライフタイムが設定されます。

Box<dyn Y> と書いた場合には Box<dyn Y + 'static> として推論されます。 'staticdrop される状況になるまで寿命が引き延ばされる特別なライフタイムです。 しかし質問者の状況では T にはライフタイム注釈が書かれていません。 (関数 f の結果である) T と (関数 g の結果である) Box<dyn Y + 'static> は依存関係があるにも関わらず g の結果のほうが長い寿命を持ちうるというエラーが生じるわけです。

故に g の結果を self と無関係にするには T に (より緩い) 制約として 'static を付けて矛盾を解消すればよいのです。

rust

1trait X { 2 type T: Y + 'static; 3 fn f(&self) -> Self::T; 4 fn g(&self) -> Box<dyn Y> { 5 Box::new(self.f()) 6 } 7}

投稿2024/08/18 02:36

SaitoAtsushi

総合スコア5628

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

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

super_omega_max

2024/08/18 03:45

解決しました! 言われてみると参照みたいな型がYを実装することもあるなと納得しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問