我正试图为我的一个类型实现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"];
游乐场
请查看切片文档中的第一个示例