2016-05-23 18 views
6

Tôi phải chuyển đổi biến số PathBuf sang số String để nạp chức năng của mình. Mã của tôi giống như sau:Cách chuyển đổi PathBuf thành String

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

nó hoạt động nhưng thật khủng khiếp với cwd.as_os_str…. Bạn có phương pháp thuận tiện hơn hay bất kỳ đề xuất nào về cách xử lý nó?

Trả lời

6

Nó không phải là dễ dàng về mục đích: String được mã hóa UTF-8, nhưng PathBuf có thể không (ví dụ: trên Windows). Vì vậy, chuyển đổi có thể thất bại.

Ngoài ra còn có các phương thức to_strto_string_lossy để thuận tiện. Trước đây trả về Option<&str> để cho biết lỗi có thể và sau đó sẽ luôn thành công nhưng sẽ thay thế các ký tự không phải UTF-8 bằng U+FFFD REPLACEMENT CHARACTER (đó là lý do tại sao nó trả về Cow<str>: nếu đường dẫn đã hợp lệ UTF-8, nó sẽ trả về một tham chiếu đến bộ đệm bên trong nhưng nếu một số ký tự được thay thế, nó sẽ phân bổ một String mới cho điều đó; trong cả hai trường hợp, bạn có thể sử dụng into_owned nếu bạn thực sự cần một String).

+0

Bạn có thể thêm giải thích ngắn gọn về 'Cow' và gợi ý sử dụng' into_owned() 'không? Hoặc tôi có thể chỉnh sửa câu trả lời của bạn để thêm nó? –

+0

Cảm ơn bạn rất nhiều. @ lukas kalbertodt, để sử dụng Cow, bạn có thể tham khảo blog này: http://hermanradtke.com/2015/05/29/creating-a-rust-function-that-returns-string-or-str.html – xiaoai

2

Như mcarton đã nói không đơn giản và không phải tất cả đường dẫn đều được mã hóa UTF-8. Nhưng bạn có thể sử dụng:

p.into_os_string().into_string() 

Để kiểm soát tốt. Bởi ? bạn có thể gửi báo lỗi cho cấp trên hoặc đơn giản là bỏ qua nó bởi unwrap():

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

Điều vẻ đẹp về into_string() là lỗi quấn giá trị ban đầu OsString.

Các vấn đề liên quan