我如何指定一个where子句,说明一个传递类型的引用可以在Rust中转换为另一个类型?

pcrecxhr  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(111)

我需要表达对某个类型参数的引用可以转换为对另一个类型参数的引用。
示例:

trait TestTrait {}

struct TestStruct {}

impl TestTrait for TestStruct {}

fn test<Trait: ?Sized, Type>(object: &Type) -> &Trait
    where ... 
{
    object
}

fn call_test()
{
    let object = TestStruct{};

    let t = test::<dyn TestTrait, TestStruct>(&object);
}

我需要在where子句中输入什么?
编辑:我不想实现From、AsRef等。我已经考虑过了。

g6ll5ycj

g6ll5ycj1#

在nightly上,您可以使用Unsize


# ![feature(unsize)]

fn test<Trait: ?Sized, Type>(object: &Type) -> &Trait
where
    Type: std::marker::Unsize<Trait>,
{
    object
}

请注意,这也会接受其他胁迫型转,例如数组到片段。
在稳定方面,我不认为有办法做到这一点。

ifmq2ha2

ifmq2ha22#

也许你想要std::convert::AsRef

fn test<Trait: ?Sized, Type>(object: &Type) -> &Trait
    where Type: AsRef<Trait>,
{
    object.as_ref()
}

但请注意,不能将traits作为类型参数。

相关问题