我不太明白为什么这行不通:
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(¤t_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(¤t_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) {}
}
答案 0 :(得分:2)
简而言之,就是不允许您在专门的泛型类型上实现Drop
。
您的DropLike
特性是 like Drop
,但是Drop
是一种语言项目,并且会从编译器中得到特殊处理。这意味着此错误仅适用于Drop
。
此代码不合法:无法将
Drop
专用于以下子集 通用类型的实现。为了使此代码正常工作,MyStruct
还必须要求T
实现Foo
。
(通过rustc --explain E0367
也可见)
这里的the issue似乎预示了这一变化。