簡體   English   中英

將盒裝特征轉換為Rust中的可變特征引用

[英]Convert boxed trait to mutable trait reference in Rust

我在Rust中使用動態調度指針類型時遇到了一些問題。 我想將Box<MyTrait>類型的值轉換為&mut MyTrait以傳遞給函數。 例如,我嘗試過:

use std::borrow::BorrowMut;

trait MyTrait {
    fn say_hi(&mut self);
}

struct MyStruct { }

impl MyTrait for MyStruct {
    fn say_hi(&mut self) {
        println!("hi");
    }
}

fn invoke_from_ref(value: &mut MyTrait) {
    value.say_hi();
}

fn main() {
    let mut boxed_trait: Box<MyTrait> = Box::new(MyStruct {});
    invoke_from_ref(boxed_trait.borrow_mut());
}

此操作失敗,並顯示以下錯誤:

error: `boxed_trait` does not live long enough
  --> <anon>:22:5
   |
21 |         invoke_from_ref(boxed_trait.borrow_mut());
   |                         ----------- borrow occurs here
22 |     }
   |     ^ `boxed_trait` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

奇怪的是,這適用於&MyTrait但不適用於&mut MyTrait 有什么辦法可以讓這個轉換在可變的情況下工作嗎?

我認為你遇到了當前編譯器生命周期處理的限制。 borrow_mut ,作為一個函數,強加了比必要更嚴格的生命周期要求。

相反,您可以通過首先解除引用框來對盒子的內部進行可變借用,如下所示:

fn main() {
    let mut boxed_trait: Box<MyTrait> = Box::new(MyStruct {});
    invoke_from_ref(&mut *boxed_trait);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM