【问题标题】:Unable to upcast into supertrait in Rust [duplicate]无法在 Rust 中转换为 supertrait [重复]
【发布时间】:2017-12-26 11:48:39
【问题描述】:

我正在尝试在 Rust 中创建一个程序,其中我有一个返回特征对象引用 (&T) 的函数,其中 T 具有 std::any::Any 作为超特征 (T 定义为 trait T: std::any::Any) .由于实现T 的每个值也必须实现std::any::Any,我希望能够做到:

fn give_T_ref() -> &'static T {
    ...
}

let y: &std::any::Any = give_T_ref();

但这会导致编译器错误,提示 expected trait `std::any::Any`, found trait `T`

这是编译器中的错误/问题,还是我遗漏了什么?目前有没有办法解决这个问题?

这是我的问题的最小可运行示例 (link to play.rust-lang.org):

use std::any::Any;

trait T: Any {}

struct Implementor {}

impl T for Implementor {}

fn give_T_ref() -> &'static T {
    &Implementor {}
}

fn main() {
    let y: &Any = give_T_ref();
    //  ^ expected trait `std::any::Any`, found trait `T`
}

【问题讨论】:

  • 这不是沮丧。这是一个向上的转变。

标签: rust traits


【解决方案1】:

虽然目前 Rust 本身不支持将 trait 对象向上转换为超特征,但通常您可以通过公开一个 trait 方法来执行您关心的具体向上转换来解决它。

在您的情况下,它可能包含一个 as_any_ref 方法,如下所示。

use std::any::Any;

trait T: Any {
    fn as_any_ref(&self) -> &Any;
}

struct Implementor {}

impl T for Implementor {
    fn as_any_ref(&self) -> &Any {
        self
    }
}

fn give_T_ref() -> &'static T {
    &Implementor {}
}

fn main() {
    let y: &Any = give_T_ref().as_any_ref();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2018-11-07
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多