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

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

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

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

Q&A

解決済

1回答

399閲覧

match式のライフタイムについて

退会済みユーザー

退会済みユーザー

総合スコア0

Rust

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

0グッド

0クリップ

投稿2022/07/02 13:24

前提

tauriを使ってフロントエンドがjs(vue.js)、バックエンド(Rust)のデスクトップアプリを作成してます。
Rustについてはまったくの初学者で初歩の初歩でつまずいてます。

実現したいこと

exeファイルのフルパスをstd::path::Pathの型で取得したいです。
最終的には「[exeファイルのディレクトリ]/tasklist/tasklist.csv」のフルパスを上記のexeファイルのフルパスから生成したいと思ってます。

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

こちらのコードを実行しようとすると

Rust

1fn read_task_list() { 2 //get task list filepath 3 let exe_pash: &Path = match std::env::current_exe() { 4 Ok(path) => path.as_path(), 5 Err(_e) => Path::new("./"), 6 };

このようなエラーが出ます。
path変数のライフタイムがOk(path) => path.as_path(),で終わってしまうのに外側の変数に値を代入しようとしてるからだと思います。(Rustの用語とちょこちょこ異なっているかもしれませんが無視してください。)

error[E0597]: `path` does not live long enough --> src\main.rs:31:17 | 30 | let exe_pash: &Path = match std::env::current_exe() { | _________________________- 31 | | Ok(path) => path.as_path(), | | ^^^^^^^^^^^^^- | | | | | | | `path` dropped here while still borrowed | | borrowed value does not live long enough 32 | | Err(_e) => Path::new("./"), 33 | | }; | |___- borrow later used here For more information about this error, try `rustc --explain E0597`.

こちらの問題を回避する方法を教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

はい。 質問者が考える通りです。 path の寿命が終わっているのにその参照を取れば辻褄が合いません。

そこを通すだけであれば ref を付ければ一応は通ります。 一時的な値は一時的な変数に束縛されているかのようにみなされてその文の終わりに寿命が尽きてしまいますが match で参照として受け取った場合には文全体 (この場合は let 構文の全体) が寿命になるようです。

rust

1use std::path::Path; 2 3fn main() { 4 let exe_pash : &Path = match std::env::current_exe() { 5 Ok(ref path) => path.as_path(), 6 Err(_e) => Path::new("./"), 7 }; 8}

しかし exe_pash の定義まで通っても exe_pash を実際に使おうとするとエラーになります。

rust

1// これはエラーになる 2use std::path::Path; 3 4fn main() { 5 let exe_pash : &Path = match std::env::current_exe() { 6 Ok(ref path) => path.as_path(), 7 Err(_e) => Path::new("./"), 8 }; 9 10 println!("{:?}", exe_pash); 11}

exe_pashpath の寿命が同時なら通るのであって、 exe_pash の寿命のほうが長くなると結局は辻褄が合わないからです。

必要なのはとにかく std::env::current_exe が返す値が exe_pash より長い寿命を持つことなので単純に分けてしまえば良いのではないでしょうか。

rust

1use std::path::Path; 2 3fn main() { 4 let foo = std::env::current_exe(); 5 let exe_pash : &Path = match foo { 6 Ok(ref path) => path.as_path(), 7 Err(_e) => Path::new("./"), 8 }; 9 10 println!("{:?}", exe_pash); 11}

投稿2022/07/02 17:02

SaitoAtsushi

総合スコア5446

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問