假设有一个实现trait Bird的元素Sparrow,现在我想将trait对象投射到鸟身上.

阅读SO上的其他答案,我假设能够将其转换为Any,然后继续使用downcast_ref选项.

不幸的是,这似乎不适用于我的情况

let bird: Rc<RefCell<dyn Bird>> = Rc::new(RefCell::new(Sparrow{ }));
let any_bird: &dyn Any = &bird;
let sparrow_option = any_bird.downcast_ref::<Sparrow>();
if sparrow_option.is_some() {
    println!("TAG OK");
} else {
    println!("TAG ERROR");
}

我能做些什么来实际将Rc<RefCell<dyn Bird>>的trait 内容投射到Sparrow

推荐答案

any_bird后面的具体类型是Rc<RefCell<dyn Bird>>,而不是Sparrow,所以.downcast_ref()只会在那个类型下成功.第Rc<RefCell<Sparrow>>章也不行

为了获得对内在Sparrow的引用,你需要在这里描述的Birdtrait 上使用as_any技巧:How to get a reference to a concrete type from a trait object?然后它看起来像这样:

if let Some(sparrow) = bird.borrow().as_any().downcast_ref::<Sparrow>() {
    println!("its a sparrow!");
} else {
    println!("its something else");
}

Rust相关问答推荐

如何在Rust中表示仅具有特定大小的数组

integer cast as pointer是什么意思

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

Gtk4-rs:将监视器作为gdk::monitor获取,而不是作为glib::对象获取

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

允许 rust 迹 struct 条目具有多种类型

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

在 Rust 中忽略 None 值的正确样式

如何基于常量在Rust中跳过一个测试

为什么带有生命周期指定的方法不能被调用两次?

使用 lalrpop 在 rust 中解析由 " 引用的字符串

在 Rust 中实现资源消耗的安全包装器

从嵌入式 Rust 中的某个时刻开始经过的时间

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

第 7.4 章片段中如何定义 `thread_rng`

使用 serde_json 进一步处理字段

使用部分键从 Hashmap 中检索值

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

为什么可以从闭包中返回私有 struct

Rustfmt 是否有明确类型的选项?