我有一个特质Foo
。如果实现者实现了另一个特质(例如Clone
),我想强制实现者定义一个方法。我的想法(Playground):
trait Foo {
// Note: in my real application, the trait has other methods as well,
// so I can't simply add `Clone` as super trait
fn foo(&self)
where
Self: Clone;
}
struct NoClone;
impl Foo for NoClone {}
不幸的是,这导致了以下问题:
error[E0046]: not all trait items implemented, missing: `foo`
--> src/lib.rs:8:1
|
2 | / fn foo(&self)
3 | | where
4 | | Self: Clone;
| |____________________- `foo` from trait
...
8 | impl Foo for NoClone {}
| ^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
我不理解这个错误:编译器明显知道
NoClone
没有实现 Clone
,那么为什么我需要提供 foo
的定义?特别是,如果我尝试提供一个定义(Playground):impl Foo for NoClone {
fn foo(&self)
where
Self: Clone
{
unreachable!()
}
}
I get the error:
error[E0277]: the trait bound `NoClone: std::clone::Clone` is not satisfied
--> src/lib.rs:9:5
|
9 | / fn foo(&self)
10 | | where
11 | | Self: Clone
12 | | {
13 | | unreachable!()
14 | | }
| |_____^ the trait `std::clone::Clone` is not implemented for `NoClone`
|
= help: see issue #48214
= help: add #![feature(trivial_bounds)] to the crate attributes to enable
这样编译器就可以确定。 (FYI:使用#![feature(trivial_bounds)]
进行编译,但我不想定义一堆带有unreachable!()
作为主体的方法。)
为什么编译器强制要求我提供方法定义?我能否以某种方式解决这个问题?