2014-09-05 6 views
1

녹의 기본 설계 결정에 대한 또 다른 질문이 있습니다.오브젝트 구성 : 참조 저장과 참조 ID 비교

저는 간단한 게임을 쓰고 있습니다. 나는 그들의 "id"에 의해 고정 된 데이터 구조에 게임 객체 풀을 가지고있다. 내 질문은 풀의 개체에 관계가있는 다른 구조체 (풀에있는 것보다 수명이 짧은)를 처리하는 방법입니다.

은 첫째 나는 다음과 같은 한 :

struct Foo<'a> { 
    game_obj: &'a GameObject 
    // etc. 
} 

을하지만 현존하는 Foo과 같은 범위에서 GameObject에 (mutably)를 참조하려고 할 때 그때 차용 검사기 문제의 무리에 달렸다.

그래서 지금은 같은 것을 고려 중이 야 :

struct Foo { 
    game_obj_id: uint, 
    // etc. 
} 

을이 아마 다른 문제를 가지고 있지만 그것은 Foo의 즉각적인 하나가 관련 GameObject를 참조 할 수있는 능력을 "독점"해결 않습니다.

어떤 일반적인 접근 방식이 있습니까?

답변

2

Rc<RefCell<GameObject>>을 대신 저장할 수 있습니다 (GameObject이 특성이 아닌 경우 동적 크기 유형 (DST)이 구현 될 때까지 작동하지 않음).

RefCell<T>은 값이이고 값이 가변적으로 빌린 것인지, 불변으로 빌린 것인지, 빌려 가지 않았는지 여부를 나타내는 플래그입니다. RefCell은 기본적으로 컴파일 시간보다는 런타임에 빌리 확인을 이동합니다. 차용 규칙을 위반 한 경우 (이미 변경 가능하거나 불변으로 차용 한 경우 변경할 수없는 차용을 할 수 없으며 이미 차용 가능하다면 변경 불가능한 차용을 할 수 없음) 작업이 실패합니다. 동시에 여러 불변 빌림이있을 수 있습니다.

Rc<T>T에 대한 포인터와 참조 횟수 (실제로는 2 개 : 강력한 참조 횟수 및 약한 참조 횟수)를 포함하는 유형입니다. .clone()Rc을 사용하면 기본 개체를 복제하지 않고 참조 횟수를 늘릴 수 있습니다. Rc이 삭제되면 참조 횟수가 감소합니다. 참조 횟수가 0으로 떨어지면 참조 대상이 삭제되고 메모리가 회수됩니다. Rc은 이미 메모리를 동적으로 할당합니다. Rc<Box<Thing>>과 같은 구문을 사용할 필요가 없습니다 (현재 수행중인 작업을 모르는 경우).

개체를 유지하지 않아도되는 참조의 경우 Rc 대신 사용할 수있는 Weak<T>도 있습니다.

+0

GameObject 풀을 변경해야합니까? 아니면 그걸 [GameObject, .. COUNT]로 유지할 수 있습니까? –

+1

'GameObject'는'RefCell' 안에 저장되어 있으므로'RefCell '의 배열을 만들어야합니다. 그러나,'Rc'를 사용하는 대신'RefCell'에 간단한 빌린 포인터를 사용할 수 있습니다. –

+0

이걸 이해하고 작동 시키려면 며칠이 걸렸지 만 마침내 컴파일과 실행 모두가 있습니다 :) 감사합니다! –