РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1170 of 1245 menu

Небезопасная реализация

Ключевое слово unsafe в контексте реализации трейта позволяет объявить небезопасную реализацию трейта для типа. Это необходимо, когда реализация трейта содержит операции, корректность которых компилятор не может гарантировать автоматически. Программист берёт на себя ответственность за соблюдение всех инвариантов, связанных с данным трейтом.

Небезопасная реализация чаще всего используется для низкоуровневых абстракций, работы с памятью, FFI и других задач, где требуется ручное управление безопасностью.

Синтаксис

unsafe impl Trait for Type { // реализация методов }

Пример

Давайте создадим небезопасную реализацию трейта, связанного с передачей данных между потоками. Для этого объявим структуру и реализуем для неё маркерный трейт Send с помощью unsafe impl:

struct MyBox(*mut u8); unsafe impl Send for MyBox {} fn main() { let b = MyBox(0 as *mut u8); println!("Send impl ok"); let _ = b; }

Результат выполнения кода:

Send impl ok

Пример

Давайте создадим собственный трейт с небезопасным методом и реализуем его для конкретного типа. При этом реализация также помечается как unsafe:

unsafe trait UnsafeTrait { fn do_something(&self) -> i32; } struct MyStruct { value: i32, } unsafe impl UnsafeTrait for MyStruct { fn do_something(&self) -> i32 { self.value } } fn main() { let s = MyStruct { value: 42 }; let res = unsafe { s.do_something() }; println!("{}", res); }

Результат выполнения кода:

42

Пример

Давайте реализуем небезопасный трейт для типа, который содержит необработанный указатель. Это распространённый случай при работе с FFI:

unsafe trait RawAccess { fn raw_value(&self) -> u8; } struct RawHolder { ptr: *const u8, } unsafe impl RawAccess for RawHolder { fn raw_value(&self) -> u8 { unsafe { *self.ptr } } } fn main() { let val: u8 = 7; let holder = RawHolder { ptr: &val }; let res = unsafe { holder.raw_value() }; println!("{}", res); }

Результат выполнения кода:

7

Смотрите также

  • ключевое слово unsafe,
    которое открывает блок небезопасного кода
  • unsafe fn,
    которое объявляет небезопасную функцию
  • unsafe trait,
    который объявляет небезопасный трейт
  • transmute,
    которая небезопасно преобразует тип одного значения в другой
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить