변형

변형은 강제 변환을 포함하는 더 큰 개념입니다: 모든 강제 변환은 변형으로 명시적으로 호출할 수 있습니다. 하지만 어떤 변환들은 변형을 필요로 합니다. 강제 변환은 흔하고 보통은 위험하지 않지만, 이런 "진짜 변형"은 희귀하고, 위험할 수 있습니다. 그런 면에서, 변형은 명시적으로 as 키워드를 사용해서 호출해야 합니다: expr as Type.

모든 변형과 그 의미들은 참조서에서 전체 목록을 볼 수 있습니다.

변형의 안전성

진정한 변형은 일반적으로 생 포인터들과 기초적인 수 타입들 주위를 맴돕니다. 위험하긴 하지만, 이 변형들은 실행 시에는 실패할 수 없습니다. 만약 어떤 변형 작업이 어떤 특수한 경우를 발생시킨다면 이런 경우가 일어났다는 표시는 주어지지 않을 것입니다. 그 변형 작업은 그냥 성공하게 됩니다. 그런 점에서 변형은 타입 단계에서 올바라야 하는데, 그렇지 않으면 컴파일 때에 방지될 것입니다. 예를 들어, 7u8 as bool은 컴파일되지 않을 것입니다.

이러한 것들을 보았을 때, 변형은 unsafe하지는 않습니다, 왜냐하면 일반적으로 그 자체로는 메모리 안정성을 위배할 수 없기 때문이죠. 예를 들어, 어떤 정수를 생 포인터로 변환하는 것은 매우 쉽게 다른 끔찍한 일들로 이어질 수 있습니다. 하지만 그 포인터를 만드는 것 자체는 안전한데, 생 포인터를 실제로 사용하는 작업이 이미 unsafe로 표시되었기 때문입니다.

변형에 대한 몇 가지 주의사항

생 슬라이스를 변형할 때의 길이

생 슬라이스를 변형할 때 길이가 조정되지 않는다는 점을 주의하세요: *const [u16] as *const [u8]은 원래 메모리의 절반만 포함하는 슬라이스를 만들어냅니다.

전이성

변형은 전이적이지 않습니다, 다시 말해, e as U1 as U2가 올바른 식이라고 해도, e as U2는 꼭 올바르지는 않을 수 있다는 겁니다.