struct Foo;
#[derive(Clone)]
struct Bar {
f: Foo,
}
fn main() {}
这导致
error[E0277]: the trait bound `Foo: std::clone::Clone` is not satisfied
--> <anon>:5:5
|
5 | f: Foo,
| ^^^^^^ the trait `std::clone::Clone` is not implemented for `Foo`
|
= note: required by `std::clone::Clone::clone`
如果所有类型的字段都实现了克隆,则只能派生Clone
。我想做同样的事情。
答案 0 :(得分:3)
查看代码的expanded version:
#![feature(prelude_import)]
#![no_std]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std as std;
struct Foo;
struct Bar {
f: Foo,
}
#[automatically_derived]
#[allow(unused_qualifications)]
impl ::std::clone::Clone for Bar {
#[inline]
fn clone(&self) -> Bar {
match *self {
Bar { f: ref __self_0_0 } => Bar { f: ::std::clone::Clone::clone(&(*__self_0_0)) },
}
}
}
fn main() {}
所有这一切都是调用一个具有特征限制的函数,传入参数。这很有用,因为无论如何都需要递归调用clone
。这样可以“免费”检查。
如果您不需要调用相关特征,您仍然可以执行与enforce that an argument implements a trait at compile time类似的操作。 Eq
通过实施hidden function on the trait来实现此目的。您还可以生成表达特征限制的一次性函数。