2017-03-18 2 views
2
struct Foo; 

#[derive(Clone)] 
struct Bar { 
    f: Foo, 
} 

fn main() {} 

Playgroundカスタムが派生したフィールドが特性を実装しているかどうかを確認できますか?

これは

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を導出することしかできない結果。私は同じことをしたいと思います。

Fieldは、それが実装する特性を公開していないようです。 Tyが特定の形質を実装しているかどうかを確認するにはどうすればよいですか?これは現在できませんか?

答えて

2

はあなたのコードの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のようなことを行うことができます。 Eqhidden function on the traitを実装してこれを行います。また、特性の境界を表現する一回限りの関数を生成することもできます。

関連する問題