簡體   English   中英

返回向量中特征的可變引用

[英]Returning mutable reference of trait in vector

rust 的新手,我正在嘗試構建一個 state 堆棧。

pub trait State {
    fn tick(&mut self);
}

pub struct StateStack {
    stack: Vec<Box<dyn State>>,
}

impl StateStack {
    pub fn push(&mut self, state: Box<dyn State>) {
        self.stack.push(state);
    }

    pub fn current(&mut self) -> &mut dyn State
    {
        &**self.stack.last_mut().expect("No state in stack")
    }
}

編譯時,我收到此錯誤:

error[E0308]: mismatched types
  --> src/main.rs:16:9
   |
14 |     pub fn current(&mut self) -> &mut dyn State
   |                                  -------------- expected `&mut dyn State` because of return type
15 |     {
16 |         &**self.stack.last_mut().expect("No state in stack")
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ types differ in mutability
   |
   = note: expected mutable reference `&mut dyn State`
                      found reference `&(dyn State + 'static)`

我不明白這個State + 'static'來自哪里,這甚至是問題所在嗎? 我不確定從哪里開始分析這個錯誤。 我想我得到了正確的deref 鏈,但我覺得我可能在這里遺漏了一些東西。

作為附帶問題,我是 OOP 開發人員,我不確定我正在做的事情是否會生銹。 state 堆棧還有其他架構要考慮嗎?

問題是您在使用&**時將通過last_mut獲得的可變引用降級為不可變引用。 您需要取而代之的是可變引用,這將解決問題:

 &mut **self.stack.last_mut().expect("No state in stack")

至於&(dyn State + 'static') ,您基本上可以忽略'static 匿名特征 ( dyn Trait ) 不是具體類型,因此它們可能不會都具有相同的生命周期要求。 dyn State + 'static表示一個匿名的State trait 可以在'static的一生中存活。 'static只是意味着生命周期不受約束,可以放在 static 上下文中。 大多數類型的生命周期為'static ,因此它不會包含在常規使用中。 某些具有'static生命周期的類型將是原語,例如f64 u32 任何不包含生命周期的dyn Trait都會得到一個隱式'static

暫無
暫無

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

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