我正在尝试为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
您可以使用范围运算符:
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)