第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決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貢獻(xiàn)1811條經(jīng)驗 獲得超5個贊

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

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

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

在這個非常相似的問題中有更好的選擇:如何匹配特質(zhì)實現(xiàn)者


查看完整回答
反對 回復(fù) 2019-08-02
  • 2 回答
  • 0 關(guān)注
  • 700 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號