我扩展了具有特征的类型,为什么我的 Vec<impl ThatTrait> 不接受实现该特征的类型?

问题描述 投票:0回答:1

我有一个特质

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]);
}

rust traits
1个回答
0
投票
泛型参数中的

impl
表示 one 这样的类型,因此不能同时用于多种类型。因此,接受
Vec<impl Input>
的函数可以用
Vec<u64>
Vec<String>
来调用,但没有称为
Vec<impl Input>
的具体类型;这是一个泛型类型参数。

对于特征对象,可以使用

dyn
代替
impl
,它允许混合多种类型的值,使用运行时查找在运行时调用正确的函数。所以你应该能够用
Vec<&dyn Input>
完成类似的事情。

© www.soinside.com 2019 - 2024. All rights reserved.