2015-01-28 3 views
0

좋아, 이제 막 조금 녹이기 시작하고 꽤 간단한 문제를 겪고 있습니다. 이 같은 재귀 유형이 : 나는재귀 유형 및 배열

hex.rs:30:29: 30:40 error: the trait `core::marker::Copy` is not implemented for the type `Tree` [E0277] 
hex.rs:30   children : Box::new([None; 100]) 
             ^~~~~~~~~~~ 
error: aborting due to previous error 

그래서 트리를 초기화하는 때, 나는 구조체 정의 전에

#[derive(Copy)] 

을 추가

나중에
struct Tree { 
    root : i32, 
    children : Box<[Option<Tree> ; 100]> 
} 

을,하지만 난 있어요 이 오류 :

hex.rs:8:10: 8:14 error: the trait `Copy` may not be implemented for this type; field `children` does not implement `Copy` [E0204] 
hex.rs:8 #[derive(Copy)] 
        ^~~~ 
note: in expansion of #[derive] 
hex.rs:8:1: 8:16 note: expansion site 
error: aborting due to previous error 

여기에서 어디로 가야할지 모르겠습니다. 재귀 적 데이터 유형에 대한 특성을 파생시키는 쉬운 방법이 있습니까?

+1

처럼 보일 수 그것은 ['단지 아무도 없다; 100]'너는 쓸 수 없다. '[없음, 없음, 없음, 없음, ...]'괜찮습니다. 그러나 의미 론적으로 나는'Vec '이 당신이 원하는 것을 더 많이 상상한다. –

+0

맞아, 그걸 시도해 보니 효과가 있었지만, 여러 가지 이유로 그 느낌이 틀렸다. Vec 은 내가 필요한 것에 적합합니다. – Emil

답변

1

BoxCopy을 지원하지 않습니다.

Types that can be copied by simply copying bits

하지만, Box 메모리에 대한 포인터를 포함하고 그냥 포인터의 비트를 복사 할 때 그 메모리는 복사되지 않습니다 : 복사 상태.

배열을 구성 할 때 Rust는 Option을 넣을 것임을 알고 있습니다. 열거 형을 사용하여 특성을 절반 만 구현하는 방법은 없습니다.

고정 크기 배열을 사용해야합니까? 아마도 이것은 잘 작동합니다 :

struct Tree { 
    root : i32, 
    children : Vec<Tree> 
} 

귀하의 생성자는 다음 Vec::with_capacity를 사용할 수 있습니다

impl Tree { 
    fn new(root: i32) -> Tree { 
     Tree { root: root, children: Vec::with_capacity(100) } 
    } 
} 
+3

'Vec'가 이미 간접 계층을 추가하기 때문에'Box'는 중복됩니다. –

+0

고정 된 크기의 배열이 나의 요구에 훨씬 더 잘 맞을 것입니다. – Emil

+0

@VladimirMatveev 멋진 지적! 대부분 내 순진한 번역으로 인해. :-) – Shepmaster

1

난 당신이 unsafe없이 그렇게 정적 배열과 반복적 유형을 사용할 수 없습니다 두려워. 그 이유는 배열 요소 형식이 Copy이어야합니다. 배열 요소 형식은 초기 요소의 바이트 복사본으로 모든 요소를 ​​초기화하고 Box을 포함하기 때문에 형식을 Copy으로 지정할 수 없기 때문에 배열 형식 요소는 Copy이어야합니다. 이는 재귀 형식을 허용하는 유일한 안전한 방법입니다 녹에서 (물론, Vec과 다른 유사한 컨테이너가 있지만 힙 할당도 필요합니다). 당신이 할당 두려워하지 않는 경우

, 당신은 단지뿐만 아니라 Vec 사용할 수 있습니다

struct Tree { 
    root: i32, 
    children: Vec<Tree> 
} 

그런 다음 초기화가

Tree { 
    root: 0, 
    children: vec![] 
} 
+0

하지만 내 초기 요소는 없음입니다. Tree에'Copy' 인스턴스가 필요한 이유는 무엇입니까? – Emil

+2

당신의 타입이'Copy'가 아니기 때문에'Option '도'Copy'가 아닙니다. 그러한 상황에서 사용할 수있는 특수한 경우의 null-argument enum 변형이 가능할 수도 있습니다. 그러나 이것은 드문 경우라고 생각합니다. 아무도 아직 귀찮은 사람이 아닙니다. 어쩌면 일반 리터럴을 얻게되면 변경 될 것입니다. –