rust 将`impl From` param转发到专用函数

fnx2tebb  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(99)

所以我有一些类型

#[derive(Debug)]
pub struct Foo {
    pub bar: u32,
    pub baz: u32,
}

impl From<(u32, u32)> for Foo {
    fn from(foo: (u32, u32)) -> Self {
        Self {
            bar: foo.0,
            baz: foo.1,
        }
    }
}

我的目标是创建一个函数,该函数将接收实现From<(u32, u32)>的内容,并将其进一步转发给期望Foo(u32, u32)的函数。

pub fn print(val: impl From<(u32, u32)>) {
    print_foo(val.into());
    print_tuple(val.into())
}

pub fn print_tuple(t: (u32, u32)) {
    println!("Tuple: {:?}", t);
}

pub fn print_foo(foo: Foo) {
    println!("Foo: {:?}", foo);
}

这将导致一个错误:

the trait `From<impl From<(u32, u32)>>` is not implemented for `Foo`
the trait `From<impl From<(u32, u32)>>` is not implemented for `(u32, u32)`

据我所知,由于into()调用,这将impl From<_> Package 为From
我的问题是如何实现这样一个目标,即拥有一个可以接收元组或结构的函数,并将其进一步传递给专门的函数。

7lrncoxx

7lrncoxx1#

impl From<T>是一个非常无用的接收值的类型,它可以是任何东西,但From让我们做的只是创建相同类型的 * 新 * 项,而不是以任何有意义的方式使用我们拥有的值。你想要的是使用Into实现:

pub fn print<T: Into<(u32, u32)> + Into<Foo> + Clone>(val: T) {
    print_foo(val.clone().into());
    print_tuple(val.into())
}

请注意,由于您希望传递相同的值两次,因此必须同时添加CopyClone绑定,或者需要for<'a> &'a T: Into<Foo>

相关问题