我总结了我的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
的类型,因此您不能只返回任何其他类型。因此,要回答您的直接问题,不可能这样做。
在这种情况下,为了使其工作,您可以将Answer
的ans
字段更改为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(¶ms);
// we can also pass a Vec of Vec
let params = vec![vec![1, 2, 3, 4]];
let my_struct = MyStruct {};
my_struct.func1(¶ms);
}
@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
。