我有一个特质
Input
,它向 to_custom_bytes()
s 和 String
s 添加了 u64
方法。
trait Input {
fn to_custom_bytes(&self) -> Vec<u8>;
}
impl Input for u64 {
fn to_custom_bytes(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Input for String {
fn to_custom_bytes(&self) -> Vec<u8> {
self.as_bytes().to_vec()
}
}
我有一个函数,它采用实现该特征的项目向量:
fn inputs_to_custom_bytes(inputs: Vec<impl Input>) -> Vec<u8> {
let mut bytes: Vec<u8> = Vec::new();
for input in inputs {
bytes.extend(input.to_custom_bytes());
}
bytes
}
当age实现了这个Trait并且参数是
expected 'String', found 'u64'
而不是Vec<impl Input>
时,为什么Rust编译器会抱怨年龄Vec<String>
?
pub fn main() {
let name = String::from("steve");
let age: u64 = 20;
let custom_bytes: Vec<u8> = inputs_to_custom_bytes(vec![name, age]);
}
impl
表示 one 这样的类型,因此不能同时用于多种类型。因此,接受 Vec<impl Input>
的函数可以用 Vec<u64>
或 Vec<String>
来调用,但没有称为 Vec<impl Input>
的具体类型;这是一个泛型类型参数。
对于特征对象,可以使用dyn
代替impl
,它允许混合多种类型的值,使用运行时查找在运行时调用正确的函数。所以你应该能够用 Vec<&dyn Input>
完成类似的事情。