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

标签 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]) {}

Playground

令人困惑的是,这与 foo() 的调用一起工作但不是 from 的电话.在第一种情况下,Rust 可以“转换”[&str; 2]。至 &[&str]但不是在后者。为什么会这样,我该如何解决?

我正在使用 Rust 1.55-nightly

最佳答案

您可以使用范围运算符:

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

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

Playground link

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

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!()
    }
}

Playground link

关于rust - 无法将数组传递给具有任意长度切片的 From 特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68530995/

相关文章:

if-statement - 何时在 Rust 中使用 `std::cmp::ordering` 而不是 `if` 语句

generics - 使用 mem::size_of::<T> 作为数组长度时,编译时无法知道类型 `T` 的值的大小

rust - Tauri 在托盘图标上单击切换应用程序可见性

rust - 明确说明引用的向量长度类型

rust - 匹配较少的样板

rust - 将自定义值添加到 Cargo.toml 文件中

scala - 类型删除 : Rust vs Scala

rust - 在 Rust 中模仿 Python 输入函数的惯用方式

rust - 调用者定义的函数中的通用返回类型

rust - 为什么 RefCell :borrow_mut result in a BorrowMutError when used on both sides of a short-circuiting boolean AND (&&)?