지금 구조가 이럼
struct Entity
struct World(vec<Entity>)
impl World {
pub fn add_entity(self, entity: Entity) -> Self {
self.0.push(entity);
self
}
}
World가 여러 Entity를 가지고있고 add_entity 함수로 entity를 추가할 수 있음. 근데 체인메서드라서
world.add_entity(a).add_entity(b).add_entity(c)
위처럼 호출 할 수 있음
이제 이걸 for문에서 사용함
for entity in entities {
world.add_entity(entity);
}
이렇게하면 add_entity가 한 루프내에서 world를 소모해서 소유권 문제로 컴파일이 불가능함
그래서 다음같이 해결해봤음
let world = Rc::new(world);
for entity in entities {
world.add_entity(entity);
}
이러면 되기는 함
근데 이 이후에 world를 다시 소모하는 애가 나옴
WorldSystem::new(world);
이러면 world는 Rc 자료형이라 안의 내용을 꺼낼 수 없어서 컴파일할 수 없음
비슷하게 RefCell도 사용해보았는데 안됨
이런 경우에는 어떤식으로 해결하는게 좋을까?
*추가
World, Entity, WorldSystem을 수정하지 않고 해결하고싶음
*해결
Iterator의 fold 함수를 이용해서 해결했음
let mut world = entities.into_iter().fold(World::new(), |world, entity| world.add_entity(entity));
댓글에 Rc 값을 뽑아오는 법도 있는데 이건 시도 안해봄
https://doc.rust-lang.org/std/rc/struct.Rc.html#method.try_unwrap
와 이딴 ㅈ불편한 언어 왜쓰는거냐 대충해도 돌아가는 js하나
나는 러스트로 짜야지 더 과감해짐
add_entities 메서드 만들기
World를 수정해서 해결하고 싶지가 않음... 내가 만들지 않는걸 건드릴수도 있는거고
무지성 clone 도배
clone derive 안해서 못함
https://doc.rust-lang.org/std/rc/struct.Rc.html#method.try_unwrap
이걸로 Rc에서 T 뽑아낼 수 잇는데?
그렇네 ㄱㅅㄱㅅ
왜 굳이 Self로 반환함 &mut Self로 반환해도 체인하는데는 문제없는데 꼭 add_entity가 self를 가져가야 할 이유가 있음?
나도 이거 + 빌더 패턴 써서 구현하는 게 자연스러워 보이는데 뭐 world를 못 고친다니까
그거는 또 몰랐음 ㄱㅅ