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



我正试图为我的一个类型实现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]) {}

游乐场

令人困惑的是,这适用于foo()的调用,而不是from的调用。在第一种情况下,Rust可以"cast"。从[&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!()
}
}

操场上联系

或者你可以使用完全限定语法告诉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!()
}
}

操场上联系

您需要将数组强制转换为切片:

let data: &[&str] = &["foo", "bar"];

游乐场

请查看切片文档中的第一个示例

最新更新