let mut a = vec!(스트링, 스트링, 스트링); 의 경우를 생각해보자.
여기에서 스트링 하나만 소유권을 가진채 빼내고 싶을 경우에 어떻게 해야할까??
일단 index와 get은 사용할수 없음.
let mut b = a[0]; 이런건 안된다는 말임.
RHS에서 index가 사용될 경우에 a[0] 은 *(a.get(0)) 으로 작용되는데,
get은 불변참조자고, 따라서 해당 불변참조자의 참조한테는 데이터의 move권한이 없어서 대입이 불가능함.
의도적으로 RHS에서 *(a.get_mut(0))을 해봤자 당연히 move 권한은 없음.
index 와 get은 모두 참조를 통한 접근을 통해서 소유권을 보존하기 때문에 이 방식은 절대 안됨.
여기에서 그래서 내가 찾은 돌파구는 iterator 하나임.
let mut a = vec!(스트링, 스트링, 스트링);
let mut b: String;
let mut i = 0;
for mut x in a {
~~~~if i == 0 {
~~~~~~~~b = x
~~~~}
}
를 통해 가능하다는 것임.
하지만 이 방식에는 부작용이 있는데,
a전체에 대한 데이터를 move 한 후에 데이터를 추출한거라서
a전체에 대한 모든 접근이 막혀버림.
부분에 대한 소유권만 빼내려는데 전체의 소유권을 건드린다는것.
애초에 작은 메카니즘에 쓰인 불필요한 작업이 너무 많은것도 문제임.
이런 상황은 보통 어떤식으로 처리함???
패턴매칭으로 가능한데 적절한 패턴을 상상하지 못하는중인건가?? 잘 모르겠네...
여기에서 스트링 하나만 소유권을 가진채 빼내고 싶을 경우에 어떻게 해야할까??
일단 index와 get은 사용할수 없음.
let mut b = a[0]; 이런건 안된다는 말임.
RHS에서 index가 사용될 경우에 a[0] 은 *(a.get(0)) 으로 작용되는데,
get은 불변참조자고, 따라서 해당 불변참조자의 참조한테는 데이터의 move권한이 없어서 대입이 불가능함.
의도적으로 RHS에서 *(a.get_mut(0))을 해봤자 당연히 move 권한은 없음.
index 와 get은 모두 참조를 통한 접근을 통해서 소유권을 보존하기 때문에 이 방식은 절대 안됨.
여기에서 그래서 내가 찾은 돌파구는 iterator 하나임.
let mut a = vec!(스트링, 스트링, 스트링);
let mut b: String;
let mut i = 0;
for mut x in a {
~~~~if i == 0 {
~~~~~~~~b = x
~~~~}
}
를 통해 가능하다는 것임.
하지만 이 방식에는 부작용이 있는데,
a전체에 대한 데이터를 move 한 후에 데이터를 추출한거라서
a전체에 대한 모든 접근이 막혀버림.
부분에 대한 소유권만 빼내려는데 전체의 소유권을 건드린다는것.
애초에 작은 메카니즘에 쓰인 불필요한 작업이 너무 많은것도 문제임.
이런 상황은 보통 어떤식으로 처리함???
패턴매칭으로 가능한데 적절한 패턴을 상상하지 못하는중인건가?? 잘 모르겠네...
let b = a.remove(0);
그리고 글을 적을땐 정리해서 올려라 두서없이 싸지르지말고 좀
질문이면 질문태그 달고 추가할 내용이 있으면 글을 수정하고
아, a에서 해당 인수를 제거하면서 반환하나보군요 ㄱㅅㄱㅅ. 표준라이브러리에 답이 나와있군...
너 자료구조 몰라?
흠... 필요없다고 생각해서 안배웠는데 pop unshift 처럼, 중간에 있는거만 빼오는것도 국룰이 있나보군요 글 너무 많이올린건 좀이따가 삭제할게요 도배된거같아서
개발자가 자료구조가 필요없다니 ㅋㅋㅋㅋ 러스트로 뻘짓하지말고 기초부터 공부하는걸 추천한다
std::mem::take(&mut a[0])
mem 모듈쪽 살펴보겠습니다. 참조자한테 한정된 메모리권한을 사용가능하게 해주나보군요
딱히 특별한 모듈은 아니고 컴파일러가 체크해주긴 힘들어도 직관적으로 가능한 동작들이 있음
이건 a[0] 값을 가져오면서 원래 위치에는 기본값을 할당하는 거네