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);
}

コードを順に確認してください。受講者がデリファレンス演算子に慣れていることを確認してください。

コードのコンパイルを試みて、コンパイラエラーを発生させてください。

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 = 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);
}