Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Использование блока unsafe

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let numbers = vec![0, 1, 2, 3, 4];
    let i = numbers.len() / 2;

    let x = *numbers.get_unchecked(i);
    assert_eq!(i, x);
}

Пройдитесь по коду. Убедитесь, что аудитория знакома с оператором разыменования.

Попробуйте скомпилировать код и вызовите ошибку компилятора.

Добавьте небезопасный блок:

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let numbers = vec![0, 1, 2, 3, 4];
    let i = numbers.len() / 2;

 let x = unsafe { *numbers.get_unchecked(i) };
    assert_eq!(i, x);
}

Попросите аудиторию провести ревью кода. Подводите слушателей к добавлению комментария о безопасности.

Добавьте комментарий о безопасности:

#![allow(unused)]
fn main() {
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

// SAFETY: `i` должен находиться в диапазоне 0..numbers.len()
}

Предлагаемое решение

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let numbers = vec![0, 1, 2, 3, 4];
    let i = numbers.len() / 2;

    let x = unsafe { *numbers.get_unchecked(i) };
    assert_eq!(i, x);
}