먼저 Slice의 내용물은 다음과 같다
Rust에선 이걸 Fat Pointer라고 부른다
그리고 Index를 구현하면
일단은 쓸수있다
문제는 이 타입은 포인터가 언제 댕글링이 될지 알수없는 unsafe한 타입이다
이 Slice를 Rusty하게 만들어보자
먼저 이 포인터의 주인이 누구일까?
Slice는 그저 포인터를 담는 컨테이너고 직접 할당하는 주체는 아니다
즉 Slice는 외부타입의 수명에 의존적인 타입이다
이를 타입에 표현하기위해 소유권을 사용해보자
PhantomData는 소유권을 담아둘 필드가 없는 구조체에 소유권을 적용시키게 하기위한 빈 구조체다
이제부터 Slice는 'origin의 수명을 갖게된다
이제 이 타입이 안전한지 시험해보자
이 코드에서 arr을 중간에 해제해보자
&'origin mut가 끝나지 않았기 때문에 arr을 해제할수 없게됐다
&mut를 얻은만큼 원본이 다시 &mut를 얻을수도 없다
즉 이 타입이 살아있는동안은 &'origin mut [T]를 아무도 접근하지 못하고 여기서 얻은 포인터 ptr은 항상 그대로라고 보증된다
마지막으로 split 함수를 만들어보자
두 Self가 가르키는 영역이 겹칠일이 없기에 이 코드는 데이터 레이스가 발생하지 않는다
그리고 수명 역시 'origin을 물려주기에 각각의 포인터들이 댕글링이 될일도 없는 안전한 코드라고 할수있다
이제보니 split가 &mut self가 아니라 self여야하네 실수함
PhantomData 없어도 from_std_slice함수에서 &mut로 가져올때 수명도 딸려오는거아님?
ㄴㄴ Slice에 'origin이 없으면 from_std_slice끝나면 'origin이 끝나버려서 &'origin mut 유지가 안됨
아..이해했음