먼저 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을 물려주기에 각각의 포인터들이 댕글링이 될일도 없는 안전한 코드라고 할수있다