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