Unsafeなトレイトの実装
関数と同様に、未定義の動作を回避するために実装で特定の条件を保証する必要がある場合は、トレイトを unsafe
としてマークできます。
For example, the zerocopy
crate has an unsafe trait that looks something like this:
use std::{mem, slice}; /// ... /// # Safety /// 型には定義された表現が必要で、パディングがあってはなりません。 pub unsafe trait IntoBytes { fn as_bytes(&self) -> &[u8] { let len = mem::size_of_val(self); unsafe { slice::from_raw_parts((&raw const self).cast::<u8>(), len) } } } // SAFETY: `u32` has a defined representation and no padding. unsafe impl IntoBytes for u32 {}
This slide should take about 5 minutes.
Rustdoc には、トレイトを安全に実装するための要件について説明した # Safety
セクションが必要です。
The actual safety section for IntoBytes
is rather longer and more complicated.
組み込みの Send
トレイトと Sync
トレイトはアンセーフです。