【发布时间】:2019-08-26 13:08:40
【问题描述】:
我有一个特质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!()
}
}
我得到错误:
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
所以编译器肯定知道。 (仅供参考:使用#![feature(trivial_bounds)] 可以编译,但我不想定义一堆以unreachable!() 为主体的方法。)
为什么编译器强制我提供方法定义?我能以某种方式解决这个问题吗?
【问题讨论】:
-
我认为这种功能会破坏V-table
-
@Stargateur 或者只是另一个特征不安全的条件。
-
你可能会觉得this issue很有趣。