解答

// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

/// Calculate the magnitude of the given vector.
fn magnitude(vector: &[f64; 3]) -> f64 {
    let mut mag_squared = 0.0;
    for coord in vector {
        mag_squared += coord * coord;
    }
    mag_squared.sqrt()
}

/// Change the magnitude of the vector to 1.0 without changing its direction.
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。これにより関数はより汎用的になりますが、 その代わりに実行時の長さチェックのコストがかかります。