Rust 如何编写一个函数,允许我将类型T转换为任何框<;B>;如果框<;T>;可以强制放入框中<;B>;?

Rust 如何编写一个函数,允许我将类型T转换为任何框<;B>;如果框<;T>;可以强制放入框中<;B>;?,rust,Rust,我正在尝试编写一个扩展特性,它允许我将类型为T的任何值移动到任何Box,其中Box可以强制到Box。我的第一次尝试如下: trait IntoBox<B: ?Sized> { fn into_box(self) -> Box<B>; } impl<T, B: ?Sized> IntoBox<B> for T where Box<T>: Into<Box<B>>, { fn into

我正在尝试编写一个扩展特性,它允许我将类型为
T
的任何值移动到任何
Box
,其中
Box
可以强制到
Box
。我的第一次尝试如下:

trait IntoBox<B: ?Sized> {
    fn into_box(self) -> Box<B>;
}

impl<T, B: ?Sized> IntoBox<B> for T
where
    Box<T>: Into<Box<B>>,
{
    fn into_box(self) -> Box<B> {
        Box::new(self).into()
    }
}

fn main() {
    // Ok
    let _: Box<u32> = 42.into_box();

    // Error: the trait bound `std::boxed::Box<std::fmt::Display>:
    // std::convert::From<std::boxed::Box<&str>>` is not satisfied
    let _: Box<std::fmt::Display> = "Hello World".into_box();
}

这似乎适用于您的示例。但是我认为你不能在没有大小的类型上调用
.into_box()
。编辑:哦,我刚刚看到你对
强制的附加约束。嗯,如果
->
自动转换,也许我根本不需要这个绑定。如果你想将装箱值转换为Trait对象,你不需要实现
From
。我相信你的问题已经由的答案回答了。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。编辑后,解决方案在一般情况下不起作用。
impl<T, B> IntoBox<B> for T
where
    Box<T>: Into<Box<B>>,
{
    fn into_box(self) -> Box<B> {
        Box::new(self).into()
    }
}

impl<T, B: ?Sized> IntoBox<B> for T
where
    B: std::marker::Unsize<T>
{
    fn into_box(self) -> Box<B> {
        Box::new(self)
    }
}