解答
// 著作権 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。これにより関数はより汎用的になりますが、 その代わりに実行時の長さチェックのコストがかかります。