不能在实现扩展特征的通用结构中使用drop

时间:2019-02-03 17:19:04

标签: rust traits

  

TL; DR https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=99952dfdc8dab353992d2681de6b6f58

     

完整版本 https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=38d0c934cb7e55b868d73bd2dde94454

我不太明白为什么这行不通:

pub trait State {}
pub trait WithFinal: State {}
pub struct Machine<T: State> {
    pub state: T,
    error: Option<fn(&Event, &T)>,
    transition: Option<fn(&T, &T, Event)>, // fn(&current_state, &previous_state)
}

impl<T: WithFinal> Drop for Machine<T> {
    fn drop(&mut self) {}
}
   Compiling scdlang v0.1.0 (/home/wildan/Projects/OSS/scdlang)
error[E0367]: The requirement `T: statechart::WithFinal` is added only by the Drop impl.
  --> src/main.rs:92:5
   |
92 | /     impl<T: WithFinal> Drop for Machine<T> {
93 | |         fn drop(&mut self) {}
94 | |     }
   | |_____^
   |
note: The same requirement must be part of the struct/enum definition
  --> src/main.rs:74:5
   |
74 | /     pub struct Machine<T: State> {
75 | |         pub state: T,
76 | |         error: Option<fn(&Event, &T)>,
77 | |         transition: Option<fn(&T, &T, Event)>, // fn(&current_state, &previous_state)
78 | |     }
   | |_____^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0367`.
error: Could not compile `scdlang`.

To learn more, run the command again with --verbose.

我认为它应该起作用,因为WithFinal扩展了特征State

但是,这两个impl都可以正常工作:

trait DropLike {
    fn drop(&mut self);
}

impl<T: WithFinal> DropLike for Machine<T> {
    fn drop(&mut self) {}
}

impl<T: State> Drop for Machine<T> {
    fn drop(&mut self) {}
}

1 个答案:

答案 0 :(得分:2)

简而言之,就是不允许您在专门的泛型类型上实现Drop

您的DropLike特性是 like Drop,但是Drop是一种语言项目,并且会从编译器中得到特殊处理。这意味着此错误仅适用于Drop

来自Rustc Error Index

  

此代码不合法​​:无法将Drop专用于以下子集   通用类型的实现。为了使此代码正常工作,MyStruct   还必须要求T实现Foo

(通过rustc --explain E0367也可见)

这里的the issue似乎预示了这一变化。