String
에 PathBuf
를 변환 할 때 복제를 방지 할 수있는 방법이 있나요?
물론입니다. 그러나 그것은 당신이하는 일이 아닙니다. 부분이이고 은 file_name
이며 변환 중입니다. 문자열의 일부에 대한 소유권을 가져올 수 없습니다.
하위 집합을 사용하지 않는 경우 전체 PathBuf
을 변환하는 경우 OsString
으로 변환 한 다음 String
으로 변환하면됩니다. 자, 내가 특정 오류를 무시하고 단지 성공 또는 실패 반환 :
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
주기를 피하기 위해 어떤 방법이 있나요?
아니
, 당신은 당신의 방법 내부의
String
(코드의 변형에 따라 소유권을 보유 중 또는
OsString
또는
PathBuf
를) 만드는 때문이다. 스택에 할당 된 항목 (문자열 포함)에 대한 참조를 반환 할 수없는 이유는
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 잘 모르겠다. 첫 번째와 세 번째 예제에서는 새 데이터가 할당되고 두 번째 예제에서는 ownership *이 함수 외부에있다. – Shepmaster
아니 그냥 C에서 그냥 argv [0] + offset' 포인터를 반환합니다 – mgoszcz2