如何正确地将&str转换为OsStr?

9

我正在使用rust-fuse,它将挂载选项作为&[&std::ffi::os_str::OsStr]。看起来我应该将我收到的逗号分隔的选项字符串拆分,我是这样做的:

mod fuse {
    use std::ffi::OsStr;

    pub fn mount(options: &[&OsStr]) {}
}

fn example(optstr: &str) {
    let mut options: &[&str] = &[];
    if optstr != "" {
        options = optstr.split(",").collect::<Vec<_>>().as_slice();
    }
    fuse::mount(options)
}

这将导致以下错误:

error[E0308]: mismatched types
  --> src/main.rs:12:17
   |
12 |     fuse::mount(options)
   |                 ^^^^^^^ expected struct `std::ffi::OsStr`, found str
   |
   = note: expected type `&[&std::ffi::OsStr]`
              found type `&[&str]`

我曾经认为所有的&str也是OsStr,但我对Rust还很陌生,所以我猜这是不正确的。

1个回答

13

使用OsStr::new

use std::ffi::OsStr;

fn main() {
    let a_string: &str = "Hello world";
    let an_os_str: &OsStr = OsStr::new(a_string);
    println!("{:?}", an_os_str);
}

请注意,显式类型说明并不是必需的,我只是为了教育目的而包含它。

针对你具体的情况:

let options: Vec<_> = optstr.split(",").map(OsStr::new).collect();
fuse::mount(&options)

实际上,需要显式执行此操作相对较少。大多数情况下,函数接受实现了 AsRef<OsStr> 的类型。这将允许您传递更多类型而无需考虑它。您可能希望考虑向维护者提出请求或提交补丁以使库更加通用。


@BogdanMart 这段代码在 Windows 10 上使用 Rust 1.42.0 编译没有问题。 - Shepmaster
1
非常抱歉。当时我在与编译器斗争后有些困惑。而且当我意识到我错了时,堆栈溢出不允许我撤回我的踩票。 但是我已经请我的朋友点赞来弥补我的失误。再次道歉。 - Bogdan Mart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接