2017-01-23 15 views
2

간단히 말해서 (그리고 위험하게 - 간결성을 위해 오류 처리 생략) 현재 실행 파일 이름을 가져와야합니다. 나는 그것을 만들었지 만, 내 함수는 &strString으로 변환하여 나중에 패턴 일치를 위해 as_str()을 호출한다. 내가 알고있는 것처럼PathBuf를 문자열로 변환 할 때 복제를 피할 수있는 방법이 있습니까?

fn binary_name() -> String { 
    std::env::current_exe().unwrap().file_name().unwrap().to_str().unwrap().to_string() 
} 

std::env::current_exe()는 나에게 내가 그것을 반환하여 전송할 수 PathBuf의 소유권을 제공합니다. 그대로 서서 &str으로 변환합니다. 거기에서 문자열을 반환하는 유일한 방법은 PathBuf이 삭제되기 전에 복제하는 것입니다.

&OsStr -> &str -> String -> &str주기를 피할 수있는 방법이 있습니까?

답변

3

StringPathBuf를 변환 할 때 복제를 방지 할 수있는 방법이 있나요?

물론입니다. 그러나 그것은 당신이하는 일이 아닙니다. 부분이이고 은 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) 
} 
+0

Neat. 나는 기능 밖에서 소유권을 옮기지 않을 방법이 없을 것이라고 생각했다. 그냥 내 C 방법을 통해 빛나는. – mgoszcz2

+0

@ mgoszcz2 잘 모르겠다. 첫 번째와 세 번째 예제에서는 새 데이터가 할당되고 두 번째 예제에서는 ownership *이 함수 외부에있다. – Shepmaster

+0

아니 그냥 C에서 그냥 argv [0] + offset' 포인터를 반환합니다 – mgoszcz2