从& str转换为OsStr的正确方法是什么?

时间:2015-12-01 14:51:42

标签: rust

我正在使用rust-fuse,它将挂载选项作为<div id="somecontainer"> <div id="content"> <header>Title</header> <div id="imagecontainer"><div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Tripod.svg/306px-Tripod.svg.png" alt="" /></div></div> <div id="descriptioncontainer">Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</div> </div> </div>。看来我应该拆分我的传入的逗号分隔选项字符串,我这样做:

&[&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 s,但我是Rust的新手,所以我猜这是错的。

1 个答案:

答案 0 :(得分:5)

使用OsStr::new

first::first()

请注意,显式类型规范不是必需的,我只是将其用于教育目的。

在您的具体案例中:

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) 的类型。这将允许您传递更多类型而无需考虑它。您可能需要考虑询问维护者或向库提交补丁以使其更通用。