2017-09-06 4 views
2

Default을 유도 다음과 같은 구조체 Foo<T> 감안할 때 : Default의 일반적인 구현에서 가능한 버그?

#[derive(Default)] 
struct Foo<T> { 
    bar: Option<T>, 
} 

왜이

fn create<T>() -> Foo<T> { 
    Foo { 
     bar: Option::default(), 
    } 
} 

을 컴파일 않습니다를하지만 그렇지 않습니다? 내 마음에

fn create_alt<T>() -> Foo<T> { 
    Foo::default() 
} 

그들은 모두 똑같은 일을하고있다 - TOption<T>Default를 구현하기 때문에 (컴파일러 나 지정할 원하는 것을입니다) Default를 구현하는 경우는 문제가 안된다.

Here은이 예가있는 녹 놀이터에 대한 링크입니다.

+0

이 작업은'Debug','Default','Clone', 그리고 아마도 더 많은 것들을 포함하여 자동으로 파생 될 수있는 몇 가지 특성들에 대해 발생합니다. 파생 된 구현에서는 모든 유형 매개 변수가이를 구현해야합니다. –

답변

1

이 문제는 알려진 문제이며 해결하기가 어렵습니다. 한마디로 Issue #26925

#[derive]가 잘못 경계를 사용합니다 : 그것은 현실에서 Option<T>: Default이 충분한 경우 Default을 구현하기 위해 Foo<T>를 들어, TDefault해야한다고 가정합니다.

개인 유형의 구조체 멤버가 있고 개인 멤버가있는 공용 일반 struct에 #[derive]을 사용하면 해당 개인 인터페이스가 부분적으로 노출 될 수 있습니다. 아마

impl Default for PubType<T> 
    where T: MyTrait 
{ ... } 

지금이 바로 주위에 얻을 수있는 가장 좋은 방법 : #[derive(Default)] 올바른 일을하는 경우 예를 들어,

trait MyTrait {} 

struct MyType<T> {} 

impl<T> Default for MyType<T> where T: MyTrait {} 

#[derive(Default)] 
pub struct PubType<T> { 
    member: MyType<T>, 
} 

, 당신은 효과적으로 개인 특성을 노출하는 공공 타입에 대해,이 impl 블록이 이 경우 #[derive]의 사용을 피하고 impl을 직접 작성해야합니다.