Day 1 Morning Exercises
Arrays and for
Loops
// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ANCHOR: transpose fn transpose(matrix: [[i32; 3]; 3]) -> [[i32; 3]; 3] { // ANCHOR_END: transpose let mut result = [[0; 3]; 3]; for i in 0..3 { for j in 0..3 { result[j][i] = matrix[i][j]; } } return result; } // ANCHOR: pretty_print fn pretty_print(matrix: &[[i32; 3]; 3]) { // ANCHOR_END: pretty_print for row in matrix { println!("{row:?}"); } } // ANCHOR: tests #[test] fn test_transpose() { let matrix = [ [101, 102, 103], // [201, 202, 203], [301, 302, 303], ]; let transposed = transpose(matrix); assert_eq!( transposed, [ [101, 201, 301], // [102, 202, 302], [103, 203, 303], ] ); } // ANCHOR_END: tests // ANCHOR: main fn main() { let matrix = [ [101, 102, 103], // <-- the comment makes rustfmt add a newline [201, 202, 203], [301, 302, 303], ]; println!("matrix:"); pretty_print(&matrix); let transposed = transpose(matrix); println!("transposed:"); pretty_print(&transposed); }
Bonus question
์ฌ์ค ์ ๋์ํ์ง ์์ต๋๋ค. slice-of-slices (&[&[i32]]
)์ ์
๋ ฅ ํ์
์ผ๋ก ์ฌ์ฉํ์ฌ ๋ชจ๋ ํฌ๊ธฐ์ ํ๋ ฌ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ฆฌํด ๊ฐ์ ์์ ํด์ผ ํ๊ธฐ๋๋ฌธ์ &[&[i32]]
ํ์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Vec<Vec<i32>>
์ ๊ฐ์ ํ์
์ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ ์๋ ์์ง๋ง ์ญ์ ์ ๋์ํ์ง ์์ต๋๋ค: Vec<Vec<i32>>
ํ์
์ &[&[i32]]
๋ก ๋ณํํ๋ ๊ฒ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ pretty_print
์ ์ฌ์ฉํ๋๋ฐ ์ด๋ ค์์ด ์์ต๋๋ค.
It honestly doesnโt work so well. It might seem that we could use a slice-of-slices (
&[&[i32]]
) as the input type to transpose and thus make our function handle any size of matrix. However, this quickly breaks down: the return type cannot be&[&[i32]]
since it needs to own the data you return.You can attempt to use something like
Vec<Vec<i32>>
, but this doesnโt work very well either: itโs hard to convert fromVec<Vec<i32>>
to&[&[i32]]
so now you cannot easily usepretty_print
either.