无法将数组传递给具有任意长度切片的 From 特征

phi*_*611 3 rust

我正在尝试为From<&[&str]>我的一种类型实现。它应该消耗任意长度的行(仅在运行时知道)并从行中获取数据。编译器抱怨这&[&str; 2]不是&[&str],即它无法将固定大小的切片转换为任意长度的切片。确切的消息是:the trait 'From<&[&str; 2]>' is not implemented for 'LineEater'

这是我的尝试:

fn main() {
    let data = ["foo", "bar"];
    
    // works
    foo(&data);

    // doesn't work
    LineEater::from(&data);

    // also doesn't work
    let data: &[&str] = data.into();
    LineEater::from(&data);
}

struct LineEater;
impl From<&[&str]> for LineEater {
    fn from(_lines: &[&str]) -> Self {
        todo!()
    }
}

fn foo(_slice: &[&str]) {}
Run Code Online (Sandbox Code Playgroud)

操场

令人困惑的是,这适用于 的调用foo()但不适用于 的调用from。在第一种情况下,Rust 可以“强制转换” [&str; 2]to&[&str]但不能在后者中“强制转换” 。为什么会这样,我该如何解决?

我每晚使用 Rust 1.55

sk_*_*ant 5

您可以使用范围运算符:

fn main() {
    let data = ["foo", "bar"];
    LineEater::from(&data[..]);
}

struct LineEater;
impl From<&[&str]> for LineEater {
    fn from(_lines: &[&str]) -> Self {
        todo!()
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

或者你可以使用完全限定的语法来告诉 Rust 你想使用以下From实现&[&str]

fn main() {
    let data = ["foo", "bar"];
    <LineEater as From<&[&str]>>::from(&data);
}

struct LineEater;
impl From<&[&str]> for LineEater {
    fn from(_lines: &[&str]) -> Self {
        todo!()
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

  • `AsRef::as_ref` 和 `Borrow::borrow` 方法也可以执行转换,以及使用 `as` 进行转换(`&amp;data as &amp;[&amp;str]`)。 (2认同)