类型不匹配:预期的类型参数"N",找到结构"Vec<u8>"



我总结了我的Rust代码如下:

struct Answer<N> {
ans: N
}
trait Trait {
fn func1<N: AsRef<[u8]>>(&self, param1: &[N]) -> Answer<N>;
}
struct MyStruct {}
impl Trait for MyStruct {
fn func1<N: AsRef<[u8]>>(&self, param1: &[N]) -> Answer<N> {

// This way we prevent bounding additional `Clone` trait on N,
//   and not do `let ans = param1[0].clone()`
let ans_ref: &[u8] = param1[0].as_ref();
let mut ans: Vec<u8> = vec![0; ans_ref.len()];
ans[..].clone_from_slice(ans_ref);

Answer { ans }
}
}
fn main() {}

Rust Playground

返回错误:

error[E0308]: mismatched types
--> src/main.rs:20:18
|
12 |     fn func1<N: AsRef<[u8]>>(&self, param1: &[N]) -> Answer<N> {
|              - this type parameter
...
20 |         Answer { ans }
|                  ^^^ expected type parameter `N`, found struct `Vec`
|
= note: expected type parameter `N`
found struct `Vec<u8>`

我的问题是,如果我在func1内部经过一些处理后确实有Vec<u8>,有没有办法";typecast";Vec<u8>返回到N: AsRef<[u8]>,因为Vec<u8>实现了AsRef<[u8]>

谢谢。

在您的示例中,您正在说"我希望param1是N〃的切片;。有人可以将&[String::from("whatever")]传递给func1,然后N将是类型String。您的返回类型是Answer<N>,因此在本例中N应该是String,但您正试图返回Vec<u8>。调用者可以选择N的类型,因此您不能只返回任何其他类型。因此,要回答您的直接问题,不可能这样做。

在这种情况下,为了使其工作,您可以将Answerans字段更改为Box<dyn AsRef<[u8]>>,例如:

struct Answer {
ans: Box<dyn AsRef<[u8]>>,
} 
trait Trait {
fn func1<N: AsRef<[u8]>>(&self, param1: &[N]) -> Answer;
}
struct MyStruct {}
impl Trait for MyStruct {
fn func1<N: AsRef<[u8]>>(&self, param1: &[N]) -> Answer {
// This way we prevent bounding additional `Clone` trait on N,
//   and not do `let ans = param1[0].clone()`
let ans_ref: &[u8] = param1[0].as_ref();
let mut ans: Vec<u8> = vec![0; ans_ref.len()];
ans[..].clone_from_slice(ans_ref);
Answer { ans: Box::new(ans) }
}
}
fn main() {
// we can pass a Vec of String, as String has an AsRef<[u8]> impl
let params = vec![String::from("test")];
let my_struct = MyStruct {};
my_struct.func1(&params);
// we can also pass a Vec of Vec
let params = vec![vec![1, 2, 3, 4]];
let my_struct = MyStruct {};
my_struct.func1(&params);
}

@wayofpie,@Stargateur(在铁锈操场上看到你的建议(谢谢你的两个建议;感谢@wayofpie理解我的问题。

最后,我的同事还提供了一个替代方案,我认为它更简单。

struct Answer<N> {
ans: N,
}
trait Trait {
fn func1<N: AsRef<[u8]> + From<Vec<u8>>>(param1: &[N]) -> Answer<N>;
}
struct MyStruct {}
impl Trait for MyStruct {
fn func1<N: AsRef<[u8]> + From<Vec<u8>>>(param1: &[N]) -> Answer<N> {
// some computation here and get the desired ans in vector of byte.
let ans: Vec<u8> = b"abc".to_vec();
Answer { ans: ans.into() }
}
}
fn main() {}

添加此处绑定的From<Vec<u8>>特征。最终,Answer中的ans需要是N类型,而不是Vec<u8>类型,因此我们需要将其转换为N

最新更新