返回向量中特征的可变引用
Returning mutable reference of trait in vector
Rust 新手,我正在尝试构建状态堆栈。
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 开发人员,我不确定我正在做的事情是否走上了生锈的道路。状态堆栈还有其他架构需要考虑吗?
问题是当您使用 &**
时,您将使用 last_mut
获得的可变引用降级为不可变引用。您需要取而代之的是可变引用,这将解决问题:
&mut **self.stack.last_mut().expect("No state in stack")
至于&(dyn State + 'static')
,你基本上可以忽略'static
。匿名特征 (dyn Trait
) 不是具体类型,因此它们可能不会都具有相同的生命周期要求。 dyn State + 'static
表示一个匿名的 State
性状,可以存活 'static
的一生。 'static
只是意味着生命周期不受约束,可以放置在静态上下文中。大多数类型的生命周期为 'static
,因此它不会包含在常规使用中。某些具有 'static
生命周期的类型将是原始类型,例如 u32
或 f64
。任何不包含生命周期的 dyn Trait
都会得到一个隐含的 'static
.
Rust 新手,我正在尝试构建状态堆栈。
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 开发人员,我不确定我正在做的事情是否走上了生锈的道路。状态堆栈还有其他架构需要考虑吗?
问题是当您使用 &**
时,您将使用 last_mut
获得的可变引用降级为不可变引用。您需要取而代之的是可变引用,这将解决问题:
&mut **self.stack.last_mut().expect("No state in stack")
至于&(dyn State + 'static')
,你基本上可以忽略'static
。匿名特征 (dyn Trait
) 不是具体类型,因此它们可能不会都具有相同的生命周期要求。 dyn State + 'static
表示一个匿名的 State
性状,可以存活 'static
的一生。 'static
只是意味着生命周期不受约束,可以放置在静态上下文中。大多数类型的生命周期为 'static
,因此它不会包含在常规使用中。某些具有 'static
生命周期的类型将是原始类型,例如 u32
或 f64
。任何不包含生命周期的 dyn Trait
都会得到一个隐含的 'static
.