2016-05-23 2 views
6

Мне нужно преобразовать переменную PathBuf в String для подачи моей функции. Мой код выглядит так:Как преобразовать PathBuf в String

let cwd = env::current_dir().unwrap(); 
let my_str: String = cwd.as_os_str().to_str().unwrap().to_string(); 
println!("{:?}", my_str); 

это работает, но это ужасно с cwd.as_os_str…. У вас есть более удобный метод или какие-либо предложения по его обработке?

ответ

6

Это не так просто: String кодируются в кодировке UTF-8, но PathBuf может не быть (например, в Windows). Таким образом, преобразование может завершиться ошибкой.

Есть также to_str и to_string_lossy методы для удобства. Первый возвращает Option<&str>, чтобы указать на возможный сбой, а позже всегда будет успешным, но заменит символы не-UTF-8 U+FFFD REPLACEMENT CHARACTER (поэтому он возвращает Cow<str>: если путь уже действителен UTF-8, он вернет ссылку на внутренний буфер, но если некоторые символы подлежат замене, он будет выделять новый String для этого: в обоих случаях вы можете использовать into_owned, если вам действительно нужен String).

+0

Не могли бы вы добавить короткое объяснение о 'Cow' и подсказке для использования' in_owned() '? Или я могу отредактировать ваш ответ, чтобы добавить его? –

+0

Большое спасибо. @lukas kalbertodt, для использования Корова, вы можете обратиться к этому блогу: http://hermanradtke.com/2015/05/29/creating-a-rust-function-that-returns-string-or-str.html – xiaoai

2

Как уже говорилось, mcarton не так прост, и не все пути кодируются UTF-8. Но вы можете использовать:

p.into_os_string().into_string() 

Чтобы иметь прекрасный контроль над ним. По ? вы можете отправить сообщение об ошибке на верхний уровень или просто игнорировать его unwrap():

let my_str = cwd.into_os_string().into_string().unwrap(); 

красота вещь into_string() является то, что ошибка укрыть оригинальную OsString значение.

Смежные вопросы