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

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

新規登録して質問してみよう
ただいま回答率
85.46%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Rust

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

Q&A

解決済

1回答

4258閲覧

Rust : 一時的な値を参照する値を返せないのでその値を一時的でなくする方法。

rtgsdfsdg

総合スコア174

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Rust

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

0グッド

0クリップ

投稿2021/08/28 17:28

編集2021/08/28 23:44

概要

期待は見出し通り。定数にファイルのパスを代入する際、関数の返り値が一時的な値を参照する値であるから代入できない。その一時的な値を永続的な値にするにはどうすればよいか?

コード

rust

1use std::path::Path; 2use once_cell::sync::Lazy; 3 4static DATA_FILE_PATH: Lazy<&Path> = Lazy::new(|| { 5 home::home_dir().unwrap().join("a_file").as_path() 6});

エラー

cannot return value referencing temporary value returns a value referencing data owned by the current function

試したこと

ライフタイムを明示する

&'staticでライフタイムを明示すればプログラムが走っている間、それは常に有効になる。

調べると上記のような記載を見つけたので明示してみたが、同じ問題が発生する。

コード

rust

1use std::path::Path; 2use once_cell::sync::Lazy; 3 4static DATA_FILE_PATH: Lazy<&'static Path> = Lazy::new(|| { 5 home::home_dir().unwrap().join("a_file").as_path() 6});

エラー

cannot return value referencing temporary value returns a value referencing data owned by the current function

型をLazy<&PathBuf>にする

Lazy<&Path>のときと同様のエラーがでた。

コード

rust

1use std::path::PathBuf; 2use once_cell::sync::Lazy; 3 4static DATA_FILE_PATH: Lazy<&PathBuf> = Lazy::new(|| { 5 &home::home_dir().unwrap().join("a_file") 6});

エラー

cannot return reference to temporary value returns a reference to data owned by the current function

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

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

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

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

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

guest

回答1

0

ベストアンサー

home::home_dir().unwrap().join("a_file")の戻り値のオブジェクトを仮にpbとします。
このとき、pb.as_path()&Pathを返すわけですが、この参照はpbと同じライフタイムとなります。
pbはクロージャの中でしか生きていないので、pb.as_path()の戻り値である参照はクロージャの外には持ち出せません。

PathBufなら外へムーブできるので、Lazyの型を変更してLazy<PathBuf>として、home::home_dir().unwrap().join("a_file")の戻り値をそのまま格納してはどうでしょうか。

投稿2021/08/28 19:29

equal-l2

総合スコア172

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

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

rtgsdfsdg

2021/08/28 23:37 編集

早くにありがとうございます。 もしPathBufが使えないと仮定した場合、Pathのライフタイムを永続化することはできないのでしょうか? また、なぜPathは外へのムーブができないのに対してPathBufはできるのですか?
rtgsdfsdg

2021/08/28 23:45

home::home_dir().unwrap().join("a_file")の戻り値をそのまま格納してみましたが同様のエラーがでます。
rtgsdfsdg

2021/08/29 00:13

すみません。こちらの誤りでした。Lazy<&PathBuf>としていました。 Lazy<PathBuf>にしたところ成功しました。 なぜPathBufだとできるのでしょうか?
equal-l2

2021/08/29 01:45

Path は str のようにそれ単体では存在できない(=参照やBox経由でしかコード中に出現できない)型です。 これを取り回しやすくするために、str に対する String のような立ち位置として、 Path に対する PathBuf が存在します。 String が str の要求される場所で使えるように、PathBuf も Path が要求されるところで使えるので、型が違うことによる問題はないはずです。
rtgsdfsdg

2021/08/29 05:09

理解できました。丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問