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

Решение

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

/// Вычисляет длину заданного вектора.
fn magnitude(vector: &[f64; 3]) -> f64 {
    let mut mag_squared = 0.0;
    for coord in vector {
        mag_squared += coord * coord;
    }
    mag_squared.sqrt()
}

/// Меняет длину вектора на 1.0, не меняя его направления.
fn normalize(vector: &mut [f64; 3]) {
    let mag = magnitude(vector);
    for item in vector {
        *item /= mag;
    }
}

fn main() {
    println!("Magnitude of a unit vector: {}", magnitude(&[0.0, 1.0, 0.0]));

    let mut v = [1.0, 2.0, 9.0];
    println!("Magnitude of {v:?}: {}", magnitude(&v));
    normalize(&mut v);
    println!("Magnitude of {v:?} after normalization: {}", magnitude(&v));
}
  • Обратите внимание, что в normalize мы можем написать *item /= mag, чтобы изменить каждый элемент. Это возможно, потому что мы перебираем массив через изменяемую ссылку, и тогда цикл for выдаёт изменяемую ссылку на каждый элемент.

  • Здесь также можно взять ссылку на срез, например fn magnitude(vector: &[f64]) -> f64. Это делает функцию более общей ценой проверки длины во время выполнения.