PathBuf
をString
に変換するときにクローニングを回避する方法はありますか?
絶対に。しかし、それはあなたがやっていることではありません。 のPathBuf
をfile_name
に変換して変換しています。文字列の一部の所有権を取得することはできません。
サブセットを使用していなかった場合は、に変換してからString
に変換すると、サブセットを使用していない場合は、PathBuf
全体を変換することができます。ここで、私は特定のエラーを無視して、成功または失敗を返す:
use std::path::PathBuf;
fn exe_name() -> Option<String> {
std::env::current_exe()
.ok()
.map(PathBuf::into_os_string)
.and_then(|exe| exe.into_string().ok())
}
はこの&OsStr -> &str -> String -> &str
サイクルを回避するための方法はありますか?
いいえ、あなたはあなたのメソッド内(コードの変形に応じて、所有権を保持している方、またはOsString
またはPathBuf
)String
を作成しているので。 Return local String as a slice (&str)を参照して、スタック割り当てアイテム(文字列を含む)への参照を返せない理由を確認してください。あなたが参照しているしたい場合は、そのQ & Aで述べたように
は、データを所有している事が参照をより長生きするために持っている:あなたの元のコードは上のクラッシュしないように記述することができ
use std::env;
use std::path::Path;
use std::ffi::OsStr;
fn binary_name(path: &Path) -> Option<&str> {
path.file_name().and_then(OsStr::to_str)
}
fn main() {
let exe = env::current_exe().ok();
match exe.as_ref().and_then(|e| binary_name(e)) {
Some("cat") => println!("Called as cat"),
Some("dog") => println!("Called as dog"),
Some(other) => println!("Why did you call me {}?", other),
None => println!("Not able to figure out what I was called as"),
}
}
簡単にエラーが発生する
fn binary_name() -> Option<String> {
let exe = std::env::current_exe();
exe.ok()
.as_ref()
.and_then(|p| p.file_name())
.and_then(|s| s.to_str())
.map(String::from)
}
Neat。私は機能の外で所有権を移さずに方法がないと思った。ちょうど私のCの方法が輝いている。 – mgoszcz2
@ mgoszcz2私があなたに従っているかどうかはわかりません。第1および第3の例では、新しいデータが割り当てられ、第2の例では、所有権*は関数外です。 – Shepmaster
いいえ、それはちょうどCです。私は 'argv [0] + offset'へのポインタを返します。 – mgoszcz2