亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從特征對象獲取對具體類型的引用?

如何從特征對象獲取對具體類型的引用?

如何從特征對象獲取對具體類型的引用?如何獲得Box<B>或&B或&Box<B>從a在此代碼變量:trait A {}struct B;impl A for B {}fn main() {    let mut a: Box<dyn A> = Box::new(B);    let b = a as Box<B>;}此代碼返回錯誤:error[E0605]: non-primitive cast: `std::boxed::Box<dyn A>` as `std::boxed::Box<B>` --> src/main.rs:8:13  |8 |     let b = a as Box<B>;  |             ^^^^^^^^^^^  |  = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
查看完整描述

2 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

應該很清楚,如果有另一種類型C實現A并且你試圖強制Box<C>轉換為強制轉換,則強制轉換可能會失敗Box<B>。我不知道你的情況,但對我來說,它看起來很像你將其他語言(如Java)的技術引入Rust。我從未在Rust中遇到過這種問題 - 也許你的代碼設計可以改進以避免這種類型的轉換。

如果你愿意,你可以“投射”任何東西mem::transmute。可悲的是,我們將有一個問題,如果我們只是想投Box<A>Box<B>&A&B因為一個指向trait是脂肪指針,實際上包含兩個指針:一個實際的對象,一到vptr的。如果我們將它轉換為struct類型,我們可以忽略vptr。請記住,這個解決方案是非常不安全和非常hacky - 我不會在“真正的”代碼中使用它。

編輯:擰,這比我想象的更不安全。如果你想以這種方式正確地做到這一點你必須使用std::raw::TraitObject。但這仍然不穩定。我不認為這對OP有任何用處; 不要用它!

在這個非常相似的問題中有更好的選擇:如何匹配特質實現者


查看完整回答
反對 回復 2019-08-02
  • 2 回答
  • 0 關注
  • 720 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號