diff --git a/listings/ch02-guessing-game-tutorial/listing-02-01/src/main.rs b/listings/ch02-guessing-game-tutorial/listing-02-01/src/main.rs index 9f38aa25c..453ce8506 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-01/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/listing-02-01/src/main.rs @@ -25,7 +25,7 @@ fn main() { // ANCHOR_END: expect // ANCHOR: print_guess - println!("You guessed: {}", guess); // 次のように予想しました: {} + println!("You guessed: {guess}"); // 次のように予想しました: {guess} // ANCHOR_END: print_guess } // ANCHOR: all diff --git a/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock b/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock index 0a2f222c2..0fb52b33c 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -8,9 +10,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -26,33 +28,32 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.86" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", @@ -60,24 +61,15 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml b/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-02/src/main.rs b/listings/ch02-guessing-game-tutorial/listing-02-02/src/main.rs index 60fb2a8e5..b35ed0f2f 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-02/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/listing-02-02/src/main.rs @@ -11,5 +11,5 @@ fn main() { .read_line(&mut guess) .expect("Failed to read line"); - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); } diff --git a/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock b/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock index 0a2f222c2..2ae9e459e 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -38,14 +40,13 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -67,15 +68,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml b/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs b/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs index 164bd46e8..bdacf04b5 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs @@ -8,10 +8,10 @@ fn main() { println!("Guess the number!"); // ANCHOR: ch07-04 - let secret_number = rand::thread_rng().gen_range(1..101); + let secret_number = rand::thread_rng().gen_range(1..=100); // ANCHOR_END: ch07-04 - println!("The secret number is: {}", secret_number); //秘密の数字は次の通り: {} + println!("The secret number is: {secret_number}"); //秘密の数字は次の通り: {secret_number} println!("Please input your guess."); @@ -21,7 +21,7 @@ fn main() { .read_line(&mut guess) .expect("Failed to read line"); - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); // ANCHOR: ch07-04 } // ANCHOR_END: ch07-04 diff --git a/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock b/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock index 0a2f222c2..2ae9e459e 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -38,14 +40,13 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -67,15 +68,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml b/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt b/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt index 0c4b6f929..91598470c 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt +++ b/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt @@ -5,42 +5,22 @@ $ cargo build Compiling ppv-lite86 v0.2.10 Compiling rand_core v0.6.2 Compiling rand_chacha v0.3.0 - Compiling rand v0.8.3 + Compiling rand v0.8.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) error[E0308]: mismatched types (型が合いません) --> src/main.rs:22:21 | 22 | match guess.cmp(&secret_number) { - | ^^^^^^^^^^^^^^ expected struct `String`, found integer - | (構造体`std::string::String`を予期したけど、整数型変数が見つかりました) + | --- ^^^^^^^^^^^^^^ expected `&String`, found `&{integer}` + | | (`&String`を予期したけど、`&{integer}`が見つかりました) + | | + | arguments to this method are incorrect + | (このメソッドへの引数が正しくありません) | = note: expected reference `&String` found reference `&{integer}` +note: method defined here + --> /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/cmp.rs:814:8 -error[E0283]: type annotations needed for `{integer}` - --> src/main.rs:8:44 - | -8 | let secret_number = rand::thread_rng().gen_range(1..101); - | ------------- ^^^^^^^^^ cannot infer type for type `{integer}` - | | - | consider giving `secret_number` a type - | - = note: multiple `impl`s satisfying `{integer}: SampleUniform` found in the `rand` crate: - - impl SampleUniform for i128; - - impl SampleUniform for i16; - - impl SampleUniform for i32; - - impl SampleUniform for i64; - and 8 more -note: required by a bound in `gen_range` - --> /Users/carolnichols/.cargo/registry/src/github.com-1ecc6299db9ec823/rand-0.8.3/src/rng.rs:129:12 - | -129 | T: SampleUniform, - | ^^^^^^^^^^^^^ required by this bound in `gen_range` -help: consider specifying the type arguments in the function call - | -8 | let secret_number = rand::thread_rng().gen_range::(1..101); - | ++++++++ - -Some errors have detailed explanations: E0283, E0308. -For more information about an error, try `rustc --explain E0283`. -error: could not compile `guessing_game` due to 2 previous errors (先の2つのエラーのため、`guessing_game`をコンパイルできませんでした) +For more information about this error, try `rustc --explain E0308`. +error: could not compile `guessing_game` (bin "guessing_game") due to 1 previous error (先の1つのエラーのため、`guessing_game` (bin "guessing_game") をコンパイルできませんでした) diff --git a/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs b/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs index d22864972..eadbaf9f2 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs @@ -8,9 +8,9 @@ fn main() { // ANCHOR_END: here println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1..101); + let secret_number = rand::thread_rng().gen_range(1..=100); - println!("The secret number is: {}", secret_number); + println!("The secret number is: {secret_number}"); println!("Please input your guess."); @@ -21,7 +21,7 @@ fn main() { .expect("Failed to read line"); // ANCHOR: here - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), //小さすぎ! diff --git a/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock b/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock index 0a2f222c2..2ae9e459e 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -38,14 +40,13 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -67,15 +68,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml b/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs b/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs index 41a4cdd14..12f497e18 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs @@ -5,9 +5,9 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1..101); + let secret_number = rand::thread_rng().gen_range(1..=100); - println!("The secret number is: {}", secret_number); + println!("The secret number is: {secret_number}"); loop { println!("Please input your guess."); @@ -28,7 +28,7 @@ fn main() { }; // ANCHOR_END: ch19 - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); // --snip-- // ANCHOR_END: here diff --git a/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock b/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock index 0a2f222c2..2ae9e459e 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -38,14 +40,13 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -67,15 +68,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml b/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs b/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs index 30859c70e..7fcbb99fb 100644 --- a/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs @@ -5,7 +5,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1..101); + let secret_number = rand::thread_rng().gen_range(1..=100); loop { println!("Please input your guess."); @@ -21,7 +21,7 @@ fn main() { Err(_) => continue, }; - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), diff --git a/listings/ch02-guessing-game-tutorial/no-listing-01-cargo-new/Cargo.lock b/listings/ch02-guessing-game-tutorial/no-listing-01-cargo-new/Cargo.lock index 5802b7dc9..ee5d79095 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-01-cargo-new/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/no-listing-01-cargo-new/Cargo.lock @@ -1,6 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "guessing_game" version = "0.1.0" - diff --git a/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/output.txt b/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/output.txt index 0c102c8c7..0905fd9d1 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/output.txt +++ b/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/output.txt @@ -1,14 +1,19 @@ $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) warning: unused `Result` that must be used -(警告: 使用されなければならない`std::result::Result`が使用されていません) +(警告: 使用されなければならない`Result`が使用されていません) --> src/main.rs:10:5 | 10 | io::stdin().read_line(&mut guess); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: `#[warn(unused_must_use)]` on by default = note: this `Result` may be an `Err` variant, which should be handled + = note: `#[warn(unused_must_use)]` on by default +help: use `let _ = ...` to ignore the resulting value +(ヘルプ: 結果の値を無視するには `let _ = ...` を使用してください) + | +10 | let _ = io::stdin().read_line(&mut guess); + | +++++++ warning: `guessing_game` (bin "guessing_game") generated 1 warning Finished dev [unoptimized + debuginfo] target(s) in 0.59s diff --git a/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/src/main.rs b/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/src/main.rs index aaf90bd65..51046016f 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/no-listing-02-without-expect/src/main.rs @@ -9,5 +9,5 @@ fn main() { io::stdin().read_line(&mut guess); - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); } diff --git a/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock b/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock index 0a2f222c2..2ae9e459e 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -38,14 +40,13 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -67,15 +68,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml b/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs b/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs index cd0962ce9..a4af2240f 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs @@ -5,9 +5,9 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1..101); + let secret_number = rand::thread_rng().gen_range(1..=100); - println!("The secret number is: {}", secret_number); + println!("The secret number is: {secret_number}"); println!("Please input your guess."); @@ -20,10 +20,9 @@ fn main() { .read_line(&mut guess) .expect("Failed to read line"); - let guess: u32 = guess.trim().parse() - .expect("Please type a number!"); //数値を入力してください! + let guess: u32 = guess.trim().parse().expect("Please type a number!"); //数値を入力してください! - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), diff --git a/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock b/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock index 0a2f222c2..2ae9e459e 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -38,14 +40,13 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -67,15 +68,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml b/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs b/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs index 61a5dc018..f97d1c58c 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs @@ -5,12 +5,12 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1..101); + let secret_number = rand::thread_rng().gen_range(1..=100); // ANCHOR: here // --snip-- - println!("The secret number is: {}", secret_number); + println!("The secret number is: {secret_number}"); loop { println!("Please input your guess."); @@ -27,7 +27,7 @@ fn main() { let guess: u32 = guess.trim().parse().expect("Please type a number!"); - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); // ANCHOR: here match guess.cmp(&secret_number) { diff --git a/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock b/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock index 0a2f222c2..2ae9e459e 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock +++ b/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "cfg-if" version = "1.0.0" @@ -38,14 +40,13 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -67,15 +68,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml b/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml index cc63f6f02..7eda67aea 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml +++ b/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.8.3" +rand = "0.8.5" diff --git a/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs b/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs index 3f8e8b771..def0a0e7e 100644 --- a/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs +++ b/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs @@ -5,9 +5,9 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1..101); + let secret_number = rand::thread_rng().gen_range(1..=100); - println!("The secret number is: {}", secret_number); + println!("The secret number is: {secret_number}"); loop { println!("Please input your guess."); @@ -20,7 +20,7 @@ fn main() { let guess: u32 = guess.trim().parse().expect("Please type a number!"); - println!("You guessed: {}", guess); + println!("You guessed: {guess}"); // ANCHOR: here // --snip-- diff --git a/listings/ch03-common-programming-concepts/listing-03-02/src/main.rs b/listings/ch03-common-programming-concepts/listing-03-02/src/main.rs index bd5b900c4..9386ad697 100644 --- a/listings/ch03-common-programming-concepts/listing-03-02/src/main.rs +++ b/listings/ch03-common-programming-concepts/listing-03-02/src/main.rs @@ -2,6 +2,6 @@ fn main() { let condition = true; let number = if condition { 5 } else { 6 }; - // numberの値は、{}です - println!("The value of number is: {}", number); + // numberの値は、{number}です + println!("The value of number is: {number}"); } diff --git a/listings/ch03-common-programming-concepts/listing-03-03/src/main.rs b/listings/ch03-common-programming-concepts/listing-03-03/src/main.rs index 568f2bc8e..64720815c 100644 --- a/listings/ch03-common-programming-concepts/listing-03-03/src/main.rs +++ b/listings/ch03-common-programming-concepts/listing-03-03/src/main.rs @@ -2,7 +2,7 @@ fn main() { let mut number = 3; while number != 0 { - println!("{}!", number); + println!("{number}!"); number -= 1; } diff --git a/listings/ch03-common-programming-concepts/listing-03-05/src/main.rs b/listings/ch03-common-programming-concepts/listing-03-05/src/main.rs index 5eaa7a09e..b44e6b7aa 100644 --- a/listings/ch03-common-programming-concepts/listing-03-05/src/main.rs +++ b/listings/ch03-common-programming-concepts/listing-03-05/src/main.rs @@ -2,6 +2,6 @@ fn main() { let a = [10, 20, 30, 40, 50]; for element in a { - println!("the value is: {}", element); + println!("the value is: {element}"); } } diff --git a/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/output.txt b/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/output.txt index 127a0b902..4e76fa360 100644 --- a/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/output.txt +++ b/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/output.txt @@ -10,9 +10,9 @@ error[E0384]: cannot assign twice to immutable variable `x` | first assignment to `x` | (`x`への最初の代入) | help: consider making this binding mutable: `mut x` -3 | println!("The value of x is: {}", x); +3 | println!("The value of x is: {x}"); 4 | x = 6; | ^^^^^ cannot assign twice to immutable variable For more information about this error, try `rustc --explain E0384`. -error: could not compile `variables` due to previous error +error: could not compile `variables` (bin "variables") due to 1 previous error diff --git a/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/src/main.rs index 84d0ad8d9..046fbb406 100644 --- a/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/src/main.rs @@ -1,6 +1,6 @@ fn main() { let x = 5; - println!("The value of x is: {}", x); // xの値は{}です + println!("The value of x is: {x}"); // xの値は{x}です x = 6; - println!("The value of x is: {}", x); + println!("The value of x is: {x}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-02-adding-mut/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-02-adding-mut/src/main.rs index c4e4a1953..a57709ccf 100644 --- a/listings/ch03-common-programming-concepts/no-listing-02-adding-mut/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-02-adding-mut/src/main.rs @@ -1,6 +1,6 @@ fn main() { let mut x = 5; - println!("The value of x is: {}", x); + println!("The value of x is: {x}"); x = 6; - println!("The value of x is: {}", x); + println!("The value of x is: {x}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-03-shadowing/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-03-shadowing/src/main.rs index 606ee68a0..03924fe1c 100644 --- a/listings/ch03-common-programming-concepts/no-listing-03-shadowing/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-03-shadowing/src/main.rs @@ -5,8 +5,8 @@ fn main() { { let x = x * 2; - println!("The value of x in the inner scope is: {}", x); + println!("The value of x in the inner scope is: {x}"); } - println!("The value of x is: {}", x); + println!("The value of x is: {x}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-05-mut-cant-change-types/output.txt b/listings/ch03-common-programming-concepts/no-listing-05-mut-cant-change-types/output.txt index 0bf395c6e..271ed387c 100644 --- a/listings/ch03-common-programming-concepts/no-listing-05-mut-cant-change-types/output.txt +++ b/listings/ch03-common-programming-concepts/no-listing-05-mut-cant-change-types/output.txt @@ -8,6 +8,12 @@ error[E0308]: mismatched types (型が合いません) 3 | spaces = spaces.len(); | ^^^^^^^^^^^^ expected `&str`, found `usize` | (&str型を予期しましたが、usizeが見つかりました) + | +help: try removing the method call + | +3 - spaces = spaces.len(); +3 + spaces = spaces; + | For more information about this error, try `rustc --explain E0308`. -error: could not compile `variables` due to previous error +error: could not compile `variables` (bin "variables") due to 1 previous error diff --git a/listings/ch03-common-programming-concepts/no-listing-07-numeric-operations/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-07-numeric-operations/src/main.rs index 2bd8f9204..df79eb4f1 100644 --- a/listings/ch03-common-programming-concepts/no-listing-07-numeric-operations/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-07-numeric-operations/src/main.rs @@ -14,8 +14,8 @@ fn main() { // division // 割り算 let quotient = 56.7 / 32.2; - let floored = 2 / 3; // Results in 0 - // 結果は0 + let truncated = -5 / 3; // Results in -1 + // 結果は-1 // remainder // 余り diff --git a/listings/ch03-common-programming-concepts/no-listing-09-char/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-09-char/src/main.rs index b52bd7f5c..1043f3990 100644 --- a/listings/ch03-common-programming-concepts/no-listing-09-char/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-09-char/src/main.rs @@ -1,5 +1,6 @@ fn main() { let c = 'z'; - let z = 'ℤ'; + let z: char = 'ℤ'; // with explicit type annotation + // 明示的型注釈付きで let heart_eyed_cat = '😻'; //ハート目の猫 } diff --git a/listings/ch03-common-programming-concepts/no-listing-11-destructuring-tuples/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-11-destructuring-tuples/src/main.rs index 35dcb442e..3002bdde4 100644 --- a/listings/ch03-common-programming-concepts/no-listing-11-destructuring-tuples/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-11-destructuring-tuples/src/main.rs @@ -3,5 +3,5 @@ fn main() { let (x, y, z) = tup; - println!("The value of y is: {}", y); + println!("The value of y is: {y}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-15-invalid-array-access/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-15-invalid-array-access/src/main.rs index a7b70697b..9d1cfcd55 100644 --- a/listings/ch03-common-programming-concepts/no-listing-15-invalid-array-access/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-15-invalid-array-access/src/main.rs @@ -21,9 +21,6 @@ fn main() { let element = a[index]; - println!( - "The value of the element at index {} is: {}", - // {}番目の要素の値は{}です - index, element - ); + println!("The value of the element at index {index} is: {element}"); + // {index}番目の要素の値は{element}です } diff --git a/listings/ch03-common-programming-concepts/no-listing-17-functions-with-parameters/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-17-functions-with-parameters/src/main.rs index 47655ec8b..e13d54d2e 100644 --- a/listings/ch03-common-programming-concepts/no-listing-17-functions-with-parameters/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-17-functions-with-parameters/src/main.rs @@ -3,5 +3,5 @@ fn main() { } fn another_function(x: i32) { - println!("The value of x is: {}", x); // xの値は{}です + println!("The value of x is: {x}"); // xの値は{x}です } diff --git a/listings/ch03-common-programming-concepts/no-listing-18-functions-with-multiple-parameters/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-18-functions-with-multiple-parameters/src/main.rs index 543c2ea45..b070ccb23 100644 --- a/listings/ch03-common-programming-concepts/no-listing-18-functions-with-multiple-parameters/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-18-functions-with-multiple-parameters/src/main.rs @@ -3,5 +3,5 @@ fn main() { } fn print_labeled_measurement(value: i32, unit_label: char) { - println!("The measurement is: {}{}", value, unit_label); + println!("The measurement is: {value}{unit_label}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-19-statements-vs-expressions/output.txt b/listings/ch03-common-programming-concepts/no-listing-19-statements-vs-expressions/output.txt index 4cf947530..2f99beed6 100644 --- a/listings/ch03-common-programming-concepts/no-listing-19-statements-vs-expressions/output.txt +++ b/listings/ch03-common-programming-concepts/no-listing-19-statements-vs-expressions/output.txt @@ -1,23 +1,14 @@ $ cargo run Compiling functions v0.1.0 (file:///projects/functions) -error: expected expression, found statement (`let`) -(エラー: 式を予期しましたが、文が見つかりました (`let`)) +error: expected expression, found `let` statement +(エラー: 式を予期しましたが、`let`文が見つかりました) --> src/main.rs:2:14 | 2 | let x = (let y = 6); - | ^^^^^^^^^ + | ^^^ | - = note: variable declaration using `let` is a statement - (注釈: `let`を使う変数宣言は、文です) - -error[E0658]: `let` expressions in this position are experimental - --> src/main.rs:2:14 - | -2 | let x = (let y = 6); - | ^^^^^^^^^ - | - = note: see issue #53667 for more information - = help: you can write `matches!(, )` instead of `let = ` + = note: only supported directly in conditions of `if` and `while` expressions + (注釈: `if` および `while` 式の条件部直下でのみ対応しています warning: unnecessary parentheses around assigned value --> src/main.rs:2:13 @@ -30,8 +21,7 @@ help: remove these parentheses | 2 - let x = (let y = 6); 2 + let x = let y = 6; - | + | -For more information about this error, try `rustc --explain E0658`. warning: `functions` (bin "functions") generated 1 warning -error: could not compile `functions` due to 2 previous errors; 1 warning emitted +error: could not compile `functions` (bin "functions") due to 1 previous error; 1 warning emitted diff --git a/listings/ch03-common-programming-concepts/no-listing-20-blocks-are-expressions/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-20-blocks-are-expressions/src/main.rs index 0be7fcbf3..64b873297 100644 --- a/listings/ch03-common-programming-concepts/no-listing-20-blocks-are-expressions/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-20-blocks-are-expressions/src/main.rs @@ -4,5 +4,5 @@ fn main() { x + 1 }; - println!("The value of y is: {}", y); + println!("The value of y is: {y}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-21-function-return-values/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-21-function-return-values/src/main.rs index 5303b1082..a11af7ec7 100644 --- a/listings/ch03-common-programming-concepts/no-listing-21-function-return-values/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-21-function-return-values/src/main.rs @@ -5,5 +5,5 @@ fn five() -> i32 { fn main() { let x = five(); - println!("The value of x is: {}", x); + println!("The value of x is: {x}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-22-function-parameter-and-return/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-22-function-parameter-and-return/src/main.rs index b4c84437a..da9d0ddb3 100644 --- a/listings/ch03-common-programming-concepts/no-listing-22-function-parameter-and-return/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-22-function-parameter-and-return/src/main.rs @@ -1,7 +1,7 @@ fn main() { let x = plus_one(5); - println!("The value of x is: {}", x); + println!("The value of x is: {x}"); } fn plus_one(x: i32) -> i32 { diff --git a/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/output.txt b/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/output.txt index 7a684650a..d13b1c891 100644 --- a/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/output.txt +++ b/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/output.txt @@ -9,7 +9,7 @@ error[E0308]: mismatched types | | | implicitly returns `()` as its body has no tail or `return` expression 8 | x + 1; - | - help: consider removing this semicolon + | - help: remove this semicolon to return this value For more information about this error, try `rustc --explain E0308`. -error: could not compile `functions` due to previous error +error: could not compile `functions` (bin "functions") due to 1 previous error diff --git a/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/src/main.rs index c9c4edc19..1cec800b6 100644 --- a/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/src/main.rs @@ -1,7 +1,7 @@ fn main() { let x = plus_one(5); - println!("The value of x is: {}", x); + println!("The value of x is: {x}"); } fn plus_one(x: i32) -> i32 { diff --git a/listings/ch03-common-programming-concepts/no-listing-28-if-condition-must-be-bool/output.txt b/listings/ch03-common-programming-concepts/no-listing-28-if-condition-must-be-bool/output.txt index 3a43db713..e8f033d36 100644 --- a/listings/ch03-common-programming-concepts/no-listing-28-if-condition-must-be-bool/output.txt +++ b/listings/ch03-common-programming-concepts/no-listing-28-if-condition-must-be-bool/output.txt @@ -9,4 +9,4 @@ error[E0308]: mismatched types | (bool型を予期したのに、整数変数が見つかりました) For more information about this error, try `rustc --explain E0308`. -error: could not compile `branches` due to previous error +error: could not compile `branches` (bin "branches") due to 1 previous error diff --git a/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/output.txt b/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/output.txt index a236054af..7e11035d3 100644 --- a/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/output.txt +++ b/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/output.txt @@ -11,4 +11,4 @@ error[E0308]: `if` and `else` have incompatible types | expected because of this For more information about this error, try `rustc --explain E0308`. -error: could not compile `branches` due to previous error +error: could not compile `branches` (bin "branches") due to 1 previous error diff --git a/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/src/main.rs index 440b286f5..df7068bcf 100644 --- a/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-31-arms-must-return-same-type/src/main.rs @@ -3,5 +3,5 @@ fn main() { let number = if condition { 5 } else { "six" }; - println!("The value of number is: {}", number); + println!("The value of number is: {number}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-32-5-loop-labels/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-32-5-loop-labels/src/main.rs index b855d7576..dd8856403 100644 --- a/listings/ch03-common-programming-concepts/no-listing-32-5-loop-labels/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-32-5-loop-labels/src/main.rs @@ -1,11 +1,11 @@ fn main() { let mut count = 0; 'counting_up: loop { - println!("count = {}", count); + println!("count = {count}"); let mut remaining = 10; loop { - println!("remaining = {}", remaining); + println!("remaining = {remaining}"); if remaining == 9 { break; } @@ -17,5 +17,5 @@ fn main() { count += 1; } - println!("End count = {}", count); + println!("End count = {count}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-33-return-value-from-loop/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-33-return-value-from-loop/src/main.rs index 6ffdab5a4..683d18bc1 100644 --- a/listings/ch03-common-programming-concepts/no-listing-33-return-value-from-loop/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-33-return-value-from-loop/src/main.rs @@ -9,5 +9,5 @@ fn main() { } }; - println!("The result is {}", result); + println!("The result is {result}"); } diff --git a/listings/ch03-common-programming-concepts/no-listing-34-for-range/src/main.rs b/listings/ch03-common-programming-concepts/no-listing-34-for-range/src/main.rs index e7286a84e..df5b305bc 100644 --- a/listings/ch03-common-programming-concepts/no-listing-34-for-range/src/main.rs +++ b/listings/ch03-common-programming-concepts/no-listing-34-for-range/src/main.rs @@ -1,6 +1,6 @@ fn main() { for number in (1..4).rev() { - println!("{}!", number); + println!("{number}!"); } println!("LIFTOFF!!!"); } diff --git a/listings/ch03-common-programming-concepts/output-only-01-no-type-annotations/output.txt b/listings/ch03-common-programming-concepts/output-only-01-no-type-annotations/output.txt index 8072cd10f..ded0312d5 100644 --- a/listings/ch03-common-programming-concepts/output-only-01-no-type-annotations/output.txt +++ b/listings/ch03-common-programming-concepts/output-only-01-no-type-annotations/output.txt @@ -1,12 +1,20 @@ $ cargo build Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations) -error[E0282]: type annotations needed +error[E0284]: type annotations needed (型注釈が必要です) --> src/main.rs:2:9 | 2 | let guess = "42".parse().expect("Not a number!"); - | ^^^^^ consider giving `guess` a type - | (`guess`に型を与えることを検討してください) + | ^^^^^ ----- type must be known at this point + | (型はこの時点で既知でなくてはなりません) + | + = note: cannot satisfy `<_ as FromStr>::Err == _` + (`<_ as FromStr>::Err == _`を満たすことができません) +help: consider giving `guess` an explicit type + | (`guess`に型を与えることを検討してください) + | +2 | let guess: /* Type */ = "42".parse().expect("Not a number!"); + | ++++++++++++ -For more information about this error, try `rustc --explain E0282`. -error: could not compile `no_type_annotations` due to previous error +For more information about this error, try `rustc --explain E0284`. +error: could not compile `no_type_annotations` (bin "no_type_annotations") due to 1 previous error diff --git a/src/ch02-00-guessing-game-tutorial.md b/src/ch02-00-guessing-game-tutorial.md index b90da438d..80b788662 100644 --- a/src/ch02-00-guessing-game-tutorial.md +++ b/src/ch02-00-guessing-game-tutorial.md @@ -8,15 +8,15 @@ Let’s jump into Rust by working through a hands-on project together! This chapter introduces you to a few common Rust concepts by showing you how to use them in a real program. You’ll learn about `let`, `match`, methods, associated -functions, using external crates, and more! In the following chapters, we’ll -explore these ideas in more detail. In this chapter, you’ll practice the +functions, external crates, and more! In the following chapters, we’ll explore +these ideas in more detail. In this chapter, you’ll just practice the fundamentals. --> ハンズオン形式のプロジェクトに一緒に取り組むことで、Rustの世界に飛び込んでみましょう!  この章ではRustの一般的な概念を、実際のプログラムでの使い方を示しながら紹介します。 -`let`、`match`、メソッド、関連関数、外部クレートの使いかたなどについて学びます!  -これらについての詳細は後続の章で取り上げますので、この章では基本的なところを練習します。 +`let`、`match`、メソッド、関連関数、外部クレートなどについて学びます!  +これらについての詳細は後続の章で取り上げますので、この章では基本的なところだけを練習します。 + @@ -166,8 +175,8 @@ prints it このコードには多くの情報が詰め込まれています。 @@ -180,9 +189,9 @@ standard library, known as `std`: ``` Rustはデフォルトで、標準ライブラリで定義されているアイテムの中のいくつかを、すべてのプログラムのスコープに取り込みます。 @@ -198,8 +207,6 @@ user input. 使いたい型がpreludeにない場合は、その型を`use`文で明示的にスコープに入れる必要があります。 `std::io`ライブラリを`use`すると、ユーザ入力を受け付ける機能など(入出力に関する)多くの便利な機能が利用できるようになります。 -[prelude]: https://doc.rust-lang.org/std/prelude/index.html - `fn`構文は関数を新しく宣言し、かっこの`()`は引数がないことを示し、波括弧の`{`は関数の本体を開始します。 @@ -270,13 +277,15 @@ let apples = 5; この行では`apples`という名前の新しい変数を作成し`5`という値に束縛しています。 -Rustでは変数はデフォルトで不変(immutable)になります。 +Rustでは変数はデフォルトで不変(immutable)で、これは一度変数に値を与えたらその値は変わらないという意味です。 この概念については第3章の[「変数と可変性」][variables-and-mutability]の節で詳しく説明します。 変数を可変(mutable)にするには、変数名の前に`mut`をつけます。 @@ -299,7 +308,7 @@ let mut bananas = 5; // mutable @@ -359,20 +366,19 @@ input: ``` -もし、プログラムの最初に`use std::io`と書いて`io`ライブラリをインポートしていなかったとしても、`std::io::stdin`のように呼び出せば、この関数を利用できます。 +もし、プログラムの最初に`use std::io;`と書いて`io`ライブラリをインポートしていなかったとしても、`std::io::stdin`のように呼び出せば、この関数を利用できます。 `stdin`関数はターミナルの標準入力へのハンドルを表す型である[`std::io::Stdin`][iostdin]のインスタンスを返します。 -[iostdin]: https://doc.rust-lang.org/std/io/struct.Stdin.html - + + -### `Result`型で失敗の可能性を扱う +### `Result`で失敗の可能性を扱う まだ、このコードの行は終わってません。 @@ -450,44 +459,30 @@ discuss what this line does. -前述したように、`read_line`メソッドは渡された文字列にユーザが入力したものを入れます。 -しかし、同時に値(この場合は[`io::Result`][ioresult])も返します。 -Rustの標準ライブラリには`Result`という名前の型がいくつかあります。 -汎用の[`Result`][result]と、`io::Result`といったサブモジュール用の特殊な型などです。 -これらの`Result`型は[*列挙型*][enums]になります。 -列挙型は*enum*とも呼ばれ、取りうる値として決まった数の*列挙子*(variant)を持ちます。 -列挙型はよく`match`と一緒に使われます。 -これは条件式の一種で、評価時に、列挙型の値がどの列挙子であるかに基づいて異なるコードを実行できるという便利なものです。 - -[ioresult]: https://doc.rust-lang.org/std/io/type.Result.html -[result]: https://doc.rust-lang.org/std/result/enum.Result.html +前述したように、`read_line`メソッドは渡された文字列にユーザが入力したものを入れますが、同時に`Result`値も返します。 +[`Result`][result]は[*列挙型*][enums]、または*enum*ともよく呼ばれるもののひとつです。 +列挙型は、複数の取りうる状態の中からどれか一つになることができる型です。 +私たちはこのそれぞれの取りうる状態のことを*列挙子* (variant) と呼びます。 -enumについては第6章で詳しく説明します。 +enumについては[第6章][enums]で詳しく説明します。 これらの`Result`型の目的は、エラー処理に関わる情報を符号化(エンコード)することです。 -[enums]: ch06-00-enums.html - `Result`の列挙子は`Ok`か`Err`です。 @@ -496,25 +491,24 @@ why the operation failed. `Result`型の値にも、他の型と同様にメソッドが定義されています。 -`io::Result`のインスタンスには[`expect`メソッド][expect]がありますので、これを呼び出せます。 -この`io::Result`インスタンスが`Err`の値の場合、`expect`メソッドはプログラムをクラッシュさせ、引数として渡されたメッセージを表示します。 +`Result`のインスタンスには[`expect`メソッド][expect]がありますので、これを呼び出せます。 +この`Result`インスタンスが`Err`の値の場合、`expect`メソッドはプログラムをクラッシュさせ、引数として渡されたメッセージを表示します。 `read_line`メソッドが`Err`を返したら、それはおそらく基礎となるオペレーティング・システムに起因するものでしょう。 -もしこの`io::Result`オブジェクトが`Ok`値の場合、`expect`メソッドは`Ok`列挙子が保持する戻り値を取り出して、その値だけを返してくれます。 +もしこの`Result`オブジェクトが`Ok`値の場合、`expect`メソッドは`Ok`列挙子が保持する戻り値を取り出して、その値だけを返してくれます。 こうして私たちはその値を使うことができるわけです。 今回の場合、その値はユーザ入力のバイト数になります。 -[expect]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect - @@ -533,13 +527,13 @@ indicating that the program hasn’t handled a possible error. Rustは私たちが`read_line`から返された`Result`値を使用していないことを警告し、これはプログラムがエラーの可能性に対処していないことを示します。 -警告を抑制する正しい方法は実際にエラー処理を書くことです。 +警告を抑制する正しい方法は実際にエラー処理コードを書くことです。 しかし、現時点では問題が起きたときにこのプログラムをクラッシュさせたいだけなので、`expect`が使えるわけです。 エラーからの回復については第9章で学びます。 @@ -563,31 +557,33 @@ the code so far: この行はユーザの入力を現在保持している文字列を表示します。 一組の波括弧の`{}`はプレースホルダーです。 `{}`は値を所定の場所に保持する小さなカニのはさみだと考えてください。 -波括弧をいくつか使えば複数の値を表示できます。 -最初の波括弧の組はフォーマット文字列のあとに並んだ最初の値に対応し、2組目は2番目の値、というように続いていきます。 -一回の`println!`の呼び出しで複数の値を表示するなら次のようになります。 +変数の値を表示するときは、変数名を波括弧の中に入れればよいです。 +式の評価結果を表示するときは、フォーマット文字列の中に空の波括弧を置き、それぞれの空の波括弧プレースホルダに表示する式を同じ順で、カンマ区切りリストにして続けてください。 +一回の`println!`の呼び出しで変数と式の結果を表示するなら次のようになります。 ```rust let x = 5; let y = 10; -println!("x = {} and y = {}", x, y); +println!("x = {x} and y + 2 = {}", y + 2); ``` -このコードは`x = 5 and y = 10`と表示するでしょう。 +このコードは`x = 5 and y + 2 = 12`と表示するでしょう。 ```console $ cargo run @@ -642,8 +643,6 @@ said functionality. Rustの標準ライブラリには、まだ乱数の機能は含まれていません。 ですが、Rustの開発チームがこの機能を持つ[`rand`クレート][randcrate]を提供してくれています。 -[randcrate]: https://crates.io/crates/rand - @@ -653,8 +652,8 @@ Rustの標準ライブラリには、まだ乱数の機能は含まれていま クレートはRustソースコードを集めたものであることを思い出してください。 @@ -666,17 +665,22 @@ programs, and can’t be executed on its own. Cargo’s coordination of external crates is where Cargo really shines. Before we can write code that uses `rand`, we need to modify the *Cargo.toml* file to include the `rand` crate as a dependency. Open that file now and add the -following line to the bottom beneath the `[dependencies]` section header that +following line to the bottom, beneath the `[dependencies]` section header that Cargo created for you. Be sure to specify `rand` exactly as we have here, with -this version number, or the code examples in this tutorial may not work. +this version number, or the code examples in this tutorial may not work: --> Cargoがその力を発揮するのは外部クレートと連携するときです。 `rand`を使ったコードを書く前に、*Cargo.toml*ファイルを編集して`rand`クレートを依存関係に含める必要があります。 そのファイルを開いて、Cargoが作ってくれた`[dependencies]`セクションヘッダの下に次の行を追加してください。 バージョンナンバーを含め、ここに書かれている通り正確に`rand`を指定してください。 -そうしないと、このチュートリアルのコード例が動作しないかもしれません。 +そうしないと、このチュートリアルのコード例が動作しないかもしれません: + *Cargo.toml*ファイルでは、ヘッダに続くものはすべて、他のセクションが始まるまで続くセクションの一部になります。 (訳注:Cargo.tomlファイル内には複数のセクションがあり、各セクションは`[ ]`で囲まれたヘッダ行から始まります) `[dependecies]`はプロジェクトが依存する外部クレートと必要とするバージョンをCargoに伝えます。 -今回は`rand`クレートを`0.8.3`というセマンティックバージョン指定子で指定します。 +今回は`rand`クレートを`0.8.5`というセマンティックバージョン指定子で指定します。 Cargoは[セマンティックバージョニング][semver](*SemVer*と呼ばれることもあります)を理解しており、これはバージョンナンバーを記述するための標準です。 -`0.8.3`という数字は実際には`^0.8.3`の省略記法で、`0.8.3`以上`0.9.0`未満の任意のバージョンを意味します。 -Cargoはこれらのバージョンを、バージョン`0.8.3`と互換性のある公開APIを持つものとみなします。 +`0.8.5`という指定子は実際には`^0.8.5`の省略記法で、0.8.5以上0.9.0未満の任意のバージョンを意味します。 + + + +Cargoはこれらのバージョンを、バージョン0.8.5と互換性のある公開APIを持つものとみなします。 この仕様により、この章のコードが引き続きコンパイルできるようにしつつ、最新のパッチリリースを取得できるようになります。 0.9.0以降のバージョンは、以下の例で使用しているものと同じAPIを持つことを保証しません。 -[semver]: http://semver.org - + ```console $ cargo build Updating crates.io index (crates.ioインデックスを更新しています) - Downloaded rand v0.8.3 - (rand v0.8.3をダウンロードしています) - Downloaded libc v0.2.86 - Downloaded getrandom v0.2.2 + Downloaded rand v0.8.5 + (rand v0.8.5をダウンロードしています) + Downloaded libc v0.2.127 + Downloaded getrandom v0.2.7 Downloaded cfg-if v1.0.0 - Downloaded ppv-lite86 v0.2.10 - Downloaded rand_chacha v0.3.0 - Downloaded rand_core v0.6.2 - Compiling rand_core v0.6.2 - (rand_core v0.6.2をコンパイルしています) - Compiling libc v0.2.86 - Compiling getrandom v0.2.2 + Downloaded ppv-lite86 v0.2.16 + Downloaded rand_chacha v0.3.1 + Downloaded rand_core v0.6.3 + Compiling libc v0.2.127 + (libc v0.2.127をコンパイルしています) + Compiling getrandom v0.2.7 Compiling cfg-if v1.0.0 - Compiling ppv-lite86 v0.2.10 - Compiling rand_chacha v0.3.0 - Compiling rand v0.8.3 + Compiling ppv-lite86 v0.2.16 + Compiling rand_core v0.6.3 + Compiling rand_chacha v0.3.1 + Compiling rand v0.8.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) (guessing_game v0.1.0をコンパイルしています) Finished dev [unoptimized + debuginfo] target(s) in 2.53s @@ -758,8 +770,8 @@ adding the rand crate as a dependency もしかしたら異なるバージョンナンバー(とはいえ、SemVerのおかげですべてのコードに互換性があります)や、 @@ -777,8 +789,6 @@ post their open source Rust projects for others to use. レジストリとは[Crates.io][cratesio]のデータのコピーです。 Crates.ioは、Rustのエコシステムにいる人たちがオープンソースのRustプロジェクトを投稿し、他の人が使えるようにする場所です。 -[cratesio]: https://crates.io - *src/main.rs*ファイルを開いて些細な変更を加え、それを保存して再度ビルドすると2行しか表示されません。 + + ```console $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) @@ -819,7 +834,7 @@ $ cargo build ``` @@ -837,7 +852,7 @@ reuse what it has already downloaded and compiled for those. Cargo has a mechanism that ensures you can rebuild the same artifact every time you or anyone else builds your code: Cargo will use only the versions of the dependencies you specified until you indicate otherwise. For example, say that -next week version 0.8.4 of the `rand` crate comes out, and that version +next week version 0.8.6 of the `rand` crate comes out, and that version contains an important bug fix, but it also contains a regression that will break your code. To handle this, Rust creates the *Cargo.lock* file the first time you run `cargo build`, so we now have this in the *guessing_game* @@ -846,25 +861,27 @@ directory. Cargoはあなたや他の人があなたのコードをビルドするたびに、同じ生成物をリビルドできるようにするしくみを備えています。 Cargoは何も指示されない限り、指定したバージョンの依存のみを使用します。 -たとえば来週`rand`クレートのバージョン0.8.4が出て、そのバージョンには重要なバグ修正が含まれていますが、同時にあなたのコードを破壊するリグレッションも含まれているとします。 +たとえば来週`rand`クレートのバージョン0.8.6が出て、そのバージョンには重要なバグ修正が含まれていますが、同時にあなたのコードを破壊するリグレッションも含まれているとします。 これに対応するため、Rustは`cargo build`を最初に実行したときに*Cargo.lock*ファイルを作成します。 (いまの*guessing_game*ディレクトリにもあるはずです) プロジェクトを初めてビルドするとき、Cargoは条件に合うすべての依存関係のバージョンを計算し*Cargo.lock*ファイルに書き込みます。 -次にプロジェクトをビルドすると、Cargoは*Cargo.lock*ファイルが存在することを確認し、バージョンを把握するすべての作業を再び行う代わりに、そこで指定されているバージョンを使います。 +次にプロジェクトをビルドすると、Cargoは*Cargo.lock*ファイルが存在することを確認し、バージョンを把握するすべての作業を再び行う代わりに、そこで指定されているバージョンを使うでしょう。 これにより再現性のあるビルドを自動的に行えます。 -言い換えれば、*Cargo.lock*ファイルのおかげで、あなたが明示的にアップグレードするまで、プロジェクトは`0.8.3`を使い続けます。 +言い換えれば、*Cargo.lock*ファイルのおかげで、あなたが明示的にアップグレードするまで、プロジェクトは0.8.5を使い続けます。 +*Cargo.lock*ファイルは再現性のあるビルドのために重要なので、プロジェクトの残りのコードとともにソース管理にチェックインされることが多いです。 クレートを*本当に*アップグレードしたくなったときのために、Cargoは`update`コマンドを提供します。 このコマンドは*Cargo.lock*ファイルを無視して、*Cargo.toml*ファイル内の全ての指定に適合する最新バージョンを算出します。 成功したらCargoはそれらのバージョンを*Cargo.lock*ファイルに記録します。 -ただし、デフォルトでCargoは`0.8.3`以上、`0.9.0`未満のバージョンのみを検索します。 -もし`rand`クレートの新しいバージョンとして`0.8.4`と`0.9.0`の二つがリリースされていたなら、`cargo update`を実行したときに以下のようなメッセージが表示されるでしょう。 +ただし、デフォルトでCargoは0.8.5以上、0.9.0未満のバージョンのみを検索します。 +もし`rand`クレートの新しいバージョンとして0.8.6と0.9.0の二つがリリースされていたなら、`cargo update`を実行したときに以下のようなメッセージが表示されるでしょう。 + + ```console $ cargo update Updating crates.io index (crates.ioインデックスを更新しています) - Updating rand v0.8.3 -> v0.8.4 - (randクレートをv0.8.3 -> v0.8.4に更新しています) + Updating rand v0.8.5 -> v0.8.6 + (randクレートをv0.8.5 -> v0.8.6に更新しています) ``` -Cargoは`0.9.0`リリースを無視します。 -またそのとき、*Cargo.lock*ファイルが変更され、`rand`クレートの現在使用中のバージョンが`0.8.4`になったことにも気づくでしょう。 -そうではなく、`rand`のバージョン`0.9.0`か、`0.9.x`系のどれかを使用するには、*Cargo.toml*ファイルを以下のように変更する必要があります。 +Cargoは0.9.0リリースを無視します。 +またそのとき、*Cargo.lock*ファイルが変更され、`rand`クレートの現在使用中のバージョンが0.8.6になったことにも気づくでしょう。 +そうではなく、`rand`のバージョン0.9.0か、0.9.*x*系のどれかを使用するには、*Cargo.toml*ファイルを以下のように変更する必要があります。 ```toml [dependencies] - rand = "0.9.0" ``` @@ -934,9 +955,6 @@ from a number of packages. いまのところは、これだけ知っていれば十分です。 Cargoはライブラリの再利用をとても簡単にしてくれるので、Rustaceanが数多くのパッケージから構成された小さなプロジェクトを書くことが可能になっています。 -[doccargo]: http://doc.crates.io -[doccratesio]: http://doc.crates.io/crates-io.html - @@ -969,44 +987,42 @@ number リスト2-3:乱数を生成するコードの追加 -まず`use rand::Rng`という行を追加します。 +まず`use rand::Rng;`という行を追加します。 `Rng`トレイトは乱数生成器が実装すべきメソッドを定義しており、それらのメソッドを使用するには、このトレイトがスコープ内になければなりません。 トレイトについて詳しくは第10章で解説します。 次に、途中に2行を追加しています。 最初の行では`rand::thread_rng`関数を呼び出して、これから使う、ある特定の乱数生成器を取得しています。 なお、この乱数生成器は現在のスレッドに固有で、オペレーティングシステムからシード値を得ています。 そして、この乱数生成器の`gen_range`メソッドを呼び出しています。 -このメソッドは`use rand::Rng`文でスコープに導入した`Rng`トレイトで定義されています。 +このメソッドは`use rand::Rng;`文でスコープに導入した`Rng`トレイトで定義されています。 `gen_range`メソッドは範囲式を引数にとり、その範囲内の乱数を生成してくれます。 -ここで使っている範囲式の種類は`開始..終了`という形式で、下限値は含みますが上限値は含みません。 +ここで使っている範囲式の種類は`開始..=終了`という形式で、下限値と上限値をともに含みます。 そのため、1から100までの数をリクエストするには`1..101`と指定する必要があります。 -あるいは、これと同等の`1..=100`という範囲を渡すこともできます。 + ```console $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) @@ -1070,8 +1094,8 @@ You should get different random numbers, and they should all be numbers between さて、ユーザ入力と乱数が揃ったので両者を比較してみましょう。 @@ -1106,19 +1130,11 @@ the three outcomes that are possible when you compare two values. `Ordering`もenumの一つで`Less`、`Greater`、`Equal`という列挙子を持っています。 これらは二つの値を比較したときに得られる3種類の結果です。 -```rust,ignore -match guess.cmp(&secret_number) { - Ordering::Less => println!("Too small!"), - Ordering::Greater => println!("Too big!"), - Ordering::Equal => println!("You win!"), -} -``` - `match`式は複数の*アーム*(腕)で構成されます。 各アームはマッチさせる*パターン*と、`match`に与えられた値がそのアームのパターンにマッチしたときに実行されるコードで構成されます。 Rustは`match`に与えられた値を受け取って、各アームのパターンを順に照合していきます。 -パターンと`match`式はRustの強力な機能で、コードか遭遇する可能性のあるさまざまな状況を表現し、それらすべてを確実に処理できるようにします。 +パターンと`match`式はRustの強力な機能です: コードか遭遇する可能性のあるさまざまな状況を表現し、それらすべてを確実に処理できるようにします。 これらの機能については、それぞれ第6章と第18章で詳しく説明します。 + +ここで使われている`match`式に対して、例を通して順に見ていきましょう。 +たとえばユーザが50と予想し、今回ランダムに生成された秘密の数字は38だったとしましょう。 + + -ここで使われている`match`式に対して、例を通して順に見ていきましょう。 -たとえばユーザが50と予想し、今回ランダムに生成された秘密の数字は38だったとしましょう。 コードが50と38を比較すると、50は38よりも大きいので`cmp`メソッドは`Ordering::Greater`を返します。 `match`式は`Ordering::Greater`の値を取得し、各アームのパターンを吟味し始めます。 まず最初のアームのパターンである`Ordering::Less`を見て、`Ordering::Greater`の値と`Ordering::Less`がマッチしないことがわかります。 そのため、このアームのコードは無視して、次のアームに移ります。 次のアームのパターンは`Ordering::Greater`で、これは`Ordering::Greater`と*マッチ*します!  このアームに関連するコードが実行され、画面に`Too big!`と表示されます。 -このシナリオでは最後のアームと照合する必要がないため`match`式(の評価)は終了します。 +このシナリオでは最初に成功したマッチで`match`式(の評価)は終了し、最後のアームとは照合されません。 + ```console {{#include ../listings/ch02-guessing-game-tutorial/listing-02-04/output.txt}} ``` @@ -1207,8 +1232,8 @@ Rustのデフォルトは`i32`型で、型情報をどこかに追加してRust 最終的にはプログラムが入力として読み込んだ`String`を実数型に変換し、秘密の数字と数値として比較できるようにしたいわけです。 @@ -1236,19 +1261,19 @@ let guess: u32 = guess.trim().parse().expect("Please type a number!"); `guess`という名前の変数を作成しています。 しかし待ってください、このプログラムには既に`guess`という名前の変数がありませんでしたか?  -たしかにありますが、Rustでは`guess`の前の値を新しい値で*覆い隠す*(shadowする)ことが許されているのです。 -シャドーイング(shadowing)は、`guess_str`と`guess`のような重複しない変数を二つ作る代わりに、`guess`という変数名を再利用させてくれるのです。 -これについては第3章で詳しく説明しますが、今のところ、この機能はある型から別の型に値を変換するときによく使われることを知っておいてください。 +たしかにありますが、Rustでは`guess`の前の値を新しい値で覆い隠す(shadowする)ことが許されているのです。 +*シャドーイング*(shadowing)は、`guess_str`と`guess`のような重複しない変数を二つ作る代わりに、`guess`という変数名を再利用させてくれるのです。 +これについては[第3章][shadowing]で詳しく説明しますが、今のところ、この機能はある型から別の型に値を変換するときによく使われることを知っておいてください。 この新しい変数を`guess.trim().parse()`という式に束縛しています。 @@ -1271,60 +1296,71 @@ class="keystroke">enter results in a carriage return and a newline, これは数値データのみを表現できる`u32`型とこの文字列を比較するために(準備として)行う必要があります。 ユーザは予想を入力したあと`read_line`の処理を終えるためにEnterキーを押す必要がありますが、これにより文字列に改行文字が追加されます。 たとえばユーザが5と入力してEnterキーを押すと、`guess`は`5\n`になります。 -この`\n`は「改行」を表しています。(WindowsではEnterキーを押すとキャリッジリターンと改行が入り`\r\n`となります) +この`\n`は「改行」を表しています。(WindowsではEnterキーを押すとキャリッジリターンと改行が入り`\r\n`となります。) `trim`メソッドは`\n`や`\r\n`を削除するので、その結果`5`だけになります。 -[文字列の`parse`メソッド][parse]は文字列をパース(解析)して何らかの数値にします。 -このメソッドは(文字列を)さまざまな数値型へとパースできるので、`let guess: u32`としてRustに正確な数値型を伝える必要があります。 +[文字列の`parse`メソッド][parse]は文字列を別の型に変換します。 +ここでは、私たちは文字列を数値に変換するために使います。 +`let guess: u32`として、Rustに欲しい数値の正確な型を伝える必要があります。 `guess`の後にコロン(`:`)を付けることで変数の型に注釈をつけることをRustに伝えています。 Rustには組み込みの数値型がいくつかあります。 ここにある`u32`は符号なし32ビット整数で、小さな正の数を表すデフォルトの型に適しています。 -他の数値型については第3章で学びます。 +他の数値型については[第3章][integers]で学びます。 + + + さらに、このサンプルプログラムでは、`u32`という注釈と`secret_number`変数との比較していることから、Rustは`secret_number`変数も`u32`型であるべきだと推論しています。 つまり、いまでは二つの同じ型の値を比較することになるわけです! -[parse]: https://doc.rust-lang.org/std/primitive.str.html#method.parse - `parse`メソッドは論理的に数値に変換できる文字にしか使えないので、よくエラーになります。 たとえば文字列に`A👍%`が含まれていたら数値に変換する術はありません。 解析に失敗する可能性があるため、`parse`メソッドは`read_line`メソッドと同様に`Result`型を返します -([「`Result`型で失敗の可能性を扱う」](#result型で失敗の可能性を扱う)で説明しました)  +([「`Result`で失敗の可能性を扱う」](#resultで失敗の可能性を扱う)で説明しました)  今回も`expect`メソッドを使用して`Result`型を同じように扱います。 `parse`メソッドが文字列から数値を作成できなかったために`Result`型の`Err`列挙子を返したら、`expect`の呼び出しはゲームをクラッシュさせ、私たちが与えたメッセージを表示します。 `parse`が文字列をうまく数値へ変換できたときは`Result`型の`Ok`列挙子を返し、`expect`は`Ok`値から欲しい数値を返してくれます。 -さあ、プログラムを走らせましょう! +さあ、プログラムを走らせましょう: + + ```console $ cargo run @@ -1398,7 +1434,8 @@ which actually introduces a new problem. It doesn’t seem like the user can qui The user could always interrupt the program by using the keyboard shortcut ctrl-c. But there’s another way to escape this insatiable monster, as mentioned in the `parse` discussion in [“Comparing the -Guess to the Secret Number”](#comparing-the-guess-to-the-secret-number): if the user enters a non-number answer, the program will crash. We +Guess to the Secret Number”](#comparing-the-guess-to-the-secret-number) +: if the user enters a non-number answer, the program will crash. We can take advantage of that to allow the user to quit, as shown here: --> @@ -1407,6 +1444,15 @@ can take advantage of that to allow the user to quit, as shown here: ユーザが数字以外の答えを入力すればプログラムはクラッシュします。 それを利用して以下のようにすれば終了できます。 + + ```console $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) @@ -1435,8 +1481,8 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` @@ -1511,8 +1557,8 @@ another guess instead of crashing the program @@ -1522,7 +1568,7 @@ method. + ```console $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) @@ -1614,17 +1669,17 @@ secret number. Listing 2-6 shows the final code. リスト2-6:数当てゲームの完全なコード -## まとめ +数当てゲームを無事に作り上げることができました。 +おめでとうございます! -数当てゲームを無事に作り上げることができました。 -おめでとうございます! +## まとめ [prelude]: https://doc.rust-lang.org/stable/std/prelude/index.html @@ -1669,7 +1725,6 @@ discusses structs and method syntax, and Chapter 6 explains how enums work. [string]: https://doc.rust-lang.org/stable/std/string/struct.String.html [iostdin]: https://doc.rust-lang.org/stable/std/io/struct.Stdin.html [read_line]: https://doc.rust-lang.org/stable/std/io/struct.Stdin.html#method.read_line -[ioresult]: https://doc.rust-lang.org/stable/std/io/type.Result.html [result]: https://doc.rust-lang.org/stable/std/result/enum.Result.html [enums]: ch06-00-enums.html [expect]: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.expect @@ -1677,7 +1732,9 @@ discusses structs and method syntax, and Chapter 6 explains how enums work. [randcrate]: https://crates.io/crates/rand [semver]: http://semver.org [cratesio]: https://crates.io/ -[doccargo]: http://doc.crates.io -[doccratesio]: http://doc.crates.io/crates-io.html +[doccargo]: https://doc.rust-lang.org/cargo/ +[doccratesio]: https://doc.rust-lang.org/cargo/reference/publishing.html [match]: ch06-02-match.html +[shadowing]: ch03-01-variables-and-mutability.html#シャドーイング [parse]: https://doc.rust-lang.org/stable/std/primitive.str.html#method.parse +[integers]: ch03-02-data-types.html#整数型 diff --git a/src/ch03-00-common-programming-concepts.md b/src/ch03-00-common-programming-concepts.md index 6b9f54805..299b7ef06 100644 --- a/src/ch03-00-common-programming-concepts.md +++ b/src/ch03-00-common-programming-concepts.md @@ -27,21 +27,23 @@ them early will give you a strong core to start from. これらの基礎は全てのRustプログラムに存在するものであり、それらを早期に学ぶことにより、強力な基礎を築くことになるでしょう。 -> ### キーワード +> #### キーワード > > Rust言語にも他の言語同様、キーワードが存在し、これらは言語だけが使用できるようになっています。 > これらの単語は、変数や関数名には使えないことを弁えておいてください。ほとんどのキーワードは、特別な意味を持っており、 > 自らのRustプログラムにおいて、様々な作業をこなすために使用することができます; > いくつかは、紐付けられた機能がないものの、将来Rustに追加されるかもしれない機能用に予約されています。 -> キーワードの一覧は、付録Aで確認できます。 +> キーワードの一覧は、[付録A][appendix_a]で確認できます。 + +[appendix_a]: appendix-01-keywords.md diff --git a/src/ch03-01-variables-and-mutability.md b/src/ch03-01-variables-and-mutability.md index 77fd81a7d..0172e9a56 100644 --- a/src/ch03-01-variables-and-mutability.md +++ b/src/ch03-01-variables-and-mutability.md @@ -5,32 +5,33 @@ ## 変数と可変性 -第2章で触れた通り、変数は標準で不変になります。これは、 +[「値を変数に保持する」][storing-values-with-variables]の節で触れた通り、変数は標準で不変になります。これは、 Rustが提供する安全性や簡便な並行性の利点を享受する形でコードを書くための選択の1つです。 ところが、まだ変数を可変にするという選択肢も残されています。 どのように、そしてなぜRustは不変性を推奨するのか、さらには、なぜそれとは違う道を選びたくなることがあるのか見ていきましょう。 変数が不変であると、値が一旦名前に束縛されたら、その値を変えることができません。 -これを具体的に説明するために、*projects*ディレクトリに`cargo new --bin variables`コマンドを使って、 -*variables*という名前のプロジェクトを生成しましょう。 +これを具体的に説明するために、*projects*ディレクトリに`cargo new variables`コマンドを使って、 +*variables*という名前のプロジェクトを生成してください。 それから、新規作成した*variables*ディレクトリで、*src/main.rs*ファイルを開き、 @@ -47,11 +48,12 @@ code with the following code that won't compile just yet: ``` -これを保存し、`cargo run`コマンドでプログラムを走らせてください。次の出力に示されているようなエラーメッセージを受け取るはずです: +これを保存し、`cargo run`コマンドでプログラムを走らせてください。 +次の出力に示されているような、不変性に関するエラーメッセージを受け取るはずです: ```console {{#include ../listings/ch03-common-programming-concepts/no-listing-01-variables-are-immutable/output.txt}} @@ -59,68 +61,66 @@ message, as shown in this output: この例では、コンパイラがプログラムに潜むエラーを見つけ出す手助けをしてくれることが示されています。 -コンパイルエラーは、イライラすることもあるものですが、まだプログラムにしてほしいことを安全に行えていないだけということなのです。 +コンパイルエラーは、イライラすることもあるものですが、本当はまだプログラムにしてほしいことを安全に行えていないだけということなのです。 エラーが出るからといって、あなたがいいプログラマではないという意味ではあり*ません*! 経験豊富なRustaceanでも、コンパイルエラーを出すことはあります。 -このエラーは、エラーの原因が`不変変数xに2回代入できない`であると示しています。不変な`x`という変数に別の値を代入しようとしたからです。 +``不変変数`x`に2回代入できません``というエラーメッセージを受け取りました。 +不変な`x`という変数に別の値を代入しようとしたからです。 -以前に不変と指定された値を変えようとした時に、コンパイルエラーが出るのは重要なことです。 +不変と指定された値を変えようとした時に、コンパイルエラーが出るのは重要なことです。 なぜなら、この状況はまさしく、バグに繋がるからです。コードのある部分は、 値が変わることはないという前提のもとに処理を行い、別の部分がその値を変更していたら、 最初の部分が目論見通りに動いていない可能性があるのです。このようなバグは、発生してしまってからでは原因が追いかけづらいものです。 特に第2のコード片が、値を*時々*しか変えない場合、尚更です。 - - - -Rustでは、値が不変であると宣言したら、本当に変わらないことをコンパイラが担保してくれます。 -つまり、コードを読み書きする際に、どこでどうやって値が変化しているかを追いかける必要がなくなります。 +Rustコンパイラは、値が不変であると宣言したら、本当に変わらないことを担保してくれるので、変更を自分で追いかける必要がなくなります。 故にコードを通して正しいことを確認するのが簡単になるのです。 -しかし、可変性は時として非常に有益なこともあります。変数は、標準でのみ、不変です。つまり、 -第2章のように変数名の前に`mut`キーワードを付けることで、可変にできるわけです。この値が変化できるようにするとともに、 -`mut`により、未来の読者に対してコードの別の部分がこの変数の値を変える可能性を示すことで、その意図を汲ませることができるのです。 +しかし可変性は非常に有用で、よりコードを書きやすくしてくれることもあります。 +変数は標準では不変ですが、[第2章][storing-values-with-variables]でやったように、 +変数名の前に`mut`キーワードを付けることで、可変にできるわけです。 +また`mut`を付けることで、コードの別の部分がこの変数の値を変えるだろうと示すことによって、 +未来の読者に対してその意図を汲ませることができるのです。 -例として、*src/main.rs*ファイルを以下のように書き換えてください: +例として、*src/main.rs*ファイルを以下のように書き換えましょう: -`mut`キーワードが使われると、`x`が束縛している値を`5`から`6`に変更できます。 -変数を可変にする方が、不変変数だけがあるよりも書きやすくなるので、変数を可変にしたくなることもあるでしょう。 +`mut`キーワードが使われると、`x`に束縛されている値を`5`から`6`に変更できます。 +可変性を使うかどうかは最終的にはプログラマに任せられており、どちらがより明白と思えるかは個別の状況によるでしょう。 -考えるべきトレードオフはバグの予防以外にも、いくつかあります。例えば、大きなデータ構造を使う場合などです。 -インスタンスを可変にして変更できるようにする方が、いちいちインスタンスをコピーして新しくメモリ割り当てされたインスタンスを返すよりも速くなります。 -小規模なデータ構造なら、新規インスタンスを生成して、もっと関数型っぽいコードを書く方が通して考えやすくなるため、 -低パフォーマンスは、その簡潔性を得るのに足りうるペナルティになるかもしれません。 +### 定数 -### 変数と定数(constants)の違い - - - -変数の値を変更できないようにするといえば、他の多くの言語も持っている別のプログラミング概念を思い浮かべるかもしれません: -*定数*です。不変変数のように、定数は名前に束縛され、変更することが叶わない値のことですが、 +不変変数のように、*定数*(constants)は名前に束縛され、変更することが叶わない値のことですが、 定数と変数の間にはいくつかの違いがあります。 まず、定数には`mut`キーワードは使えません: 定数は標準で不変であるだけでなく、常に不変なのです。 - - - 定数は`let`キーワードの代わりに、`const`キーワードで宣言し、値の型は*必ず*注釈しなければなりません。 -型と型注釈については次のセクション、「データ型」で講義しますので、その詳細について気にする必要はありません。 +型と型注釈については次のセクション、[「データ型」][data-types]で講義しますので、その詳細について気にする必要はありません。 ただ単に型は常に注釈しなければならないのだと思っていてください。 -最後の違いは、定数は定数式にしかセットできないことです。関数呼び出し結果や、実行時に評価される値にはセットできません。 +最後の違いは、定数は定数式にしかセットできないことです。実行時に評価される値にはセットできません。 -定数の名前が`MAX_POINTS`で、値が100,000にセットされた定数定義の例をご覧ください。(Rustの定数の命名規則は、 -全て大文字でアンダースコアで単語区切りすることです): +これが定数定義の例です: ```rust -const MAX_POINTS: u32 = 100_000; +const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3; ``` -定数は、プログラムが走る期間、定義されたスコープ内でずっと有効です。従って、 -プログラムのいろんなところで使用される可能性のあるアプリケーション空間の値を定義するのに有益な選択肢になります。 +定数の名前は`THREE_HOURS_IN_SECONDS`で、その値は60(1分あたりの秒数)×60(1時間あたりの分数)×3(このプログラムで数えたい時間数)の結果にセットされています。 +Rustの定数の命名規則は、全て大文字でアンダースコアで単語区切りすることです。 +コンパイラはコンパイル時に一部の演算を評価することができるので、この定数に10,800という値を設定する代わりに、理解し検証しやすい方法でこの値を書き出すことを選択できます。 +定数宣言内でどの演算が使用できるかについてのさらなる情報は、[Rust Referenceのconstant evaluationの節][const-eval]をお読みください。 + + + +定数は、プログラムが走る期間、定義されたスコープ内でずっと有効です。 +この性質のおかげで、定数はプログラムのいろんなところで使用される可能性のあるアプリケーション空間の値を定義するのに有用です。 例えば、ゲームでプレイヤーが取得可能なポイントの最高値や、光速度などですね。 -第2章の数当てゲームのチュートリアル、「予想と秘密の数字を比較する」節で見たように、前に定義した変数と同じ名前の変数を新しく宣言でき、 -新しい変数は、前の変数を覆い隠します。Rustaceanはこれを最初の変数は、 -2番目の変数に*覆い隠さ*れたと言い、この変数を使用した際に、2番目の変数の値が現れるということです。 +[第2章][comparing-the-guess-to-the-secret-number]の数当てゲームのチュートリアルで見たように、 +前に定義した変数と同じ名前の変数を新しく宣言できます。 +Rustaceanはこれを、最初の変数は2番目の変数に*覆い隠さ*れたと言います。 +これはその変数名を使用した際に、コンパイラは2番目の変数を見るという意味です。 +2番目の変数は実質的に、最初の変数にその影を投げかけ、自身が覆い隠されるかスコープが終了するまで、 +変数名の使用を自身へのものとして扱います。 以下のようにして、同じ変数名を用いて変数を覆い隠し、`let`キーワードの使用を繰り返します: -このプログラムはまず、`x`を`5`という値に束縛します。それから`let x =`を繰り返すことで`x`を覆い隠し、 +このプログラムはまず、`x`を`5`という値に束縛します。それから`let x =`を繰り返すことで新しい変数`x`を作り、 元の値に`1`を加えることになるので、`x`の値は`6`になります。 -3番目の`let`文も`x`を覆い隠し、以前の値に`2`をかけることになるので、`x`の最終的な値は`12`になります。 -括弧を抜けるとシャドーイングは終了し、`x`の値は元の`6`に戻ります。 +次に波括弧によって作られた内側のスコープの中で、3番目の`let`文も`x`を覆い隠して新しい変数を作り、 +以前の値に`2`をかけることになるので、`x`の最終的な値は`12`になります。 +スコープが終わるとシャドーイングは終了し、`x`の値は元の`6`に戻ります。 このプログラムを走らせたら、以下のように出力するでしょう: ```console @@ -304,7 +305,7 @@ When we run this program, it will output the following: ``` `mut`と上書きのもう一つの違いは、再度`let`キーワードを使用したら、実効的には新しい変数を生成していることになるので、 値の型を変えつつ、同じ変数名を使いまわせることです。例えば、 -プログラムがユーザに何らかのテキストに対して空白文字を入力することで何個分のスペースを表示したいかを尋ねますが、 -ただ、実際にはこの入力を数値として保持したいとしましょう: +プログラムがユーザに何らかのテキストに対して空白文字を入力することで何個分のスペースを表示したいかを尋ねて、 +そうしたらこの入力を数値として保持したいとしましょう: ```rust {{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-04-shadowing-can-change-types/src/main.rs:here}} ``` -この文法要素は、容認されます。というのも、最初の`spaces`変数は文字列型であり、2番目の`spaces`変数は、 -たまたま最初の変数と同じ名前になったまっさらな変数のわけですが、数値型になるからです。故に、シャドーイングのおかげで、 +最初の`spaces`変数は文字列型であり、2番目の`spaces`変数は数値型です。故に、シャドーイングのおかげで、 異なる名前を思いつく必要がなくなるわけです。`spaces_str`と`spaces_num`などですね; 代わりに、 よりシンプルな`spaces`という名前を再利用できるわけです。一方で、この場合に`mut`を使おうとすると、 以下に示した通りですが、コンパイルエラーになるわけです: @@ -352,8 +351,7 @@ try to use `mut` for this, as shown here, we'll get a compile-time error: ``` 変数の型を可変にすることは許されていないと言われているわけです: @@ -368,3 +366,17 @@ can have. --> さあ、変数が動作する方法を見てきたので、今度は変数が取りうるデータ型について見ていきましょう。 + + + +[comparing-the-guess-to-the-secret-number]: +ch02-00-guessing-game-tutorial.html#予想と秘密の数字を比較する +[data-types]: ch03-02-data-types.html#データ型 +[storing-values-with-variables]: ch02-00-guessing-game-tutorial.html#値を変数に保持する +[const-eval]: https://doc.rust-lang.org/reference/const_eval.html diff --git a/src/ch03-02-data-types.md b/src/ch03-02-data-types.md index eb7486ce5..7d8f93849 100644 --- a/src/ch03-02-data-types.md +++ b/src/ch03-02-data-types.md @@ -6,7 +6,7 @@ @@ -18,14 +18,15 @@ Keep in mind that Rust is a *statically typed* language, which means that it must know the types of all variables at compile time. The compiler can usually infer what type we want to use based on the value and how we use it. In cases when many types are possible, such as when we converted a `String` to a numeric -type using `parse` in the “Comparing the Guess to the Secret Number” section in +type using `parse` in the [“Comparing the Guess to the Secret +Number”][comparing-the-guess-to-the-secret-number] section in Chapter 2, we must add a type annotation, like this: --> Rustは*静的型付き*言語であることを弁えておいてください。つまり、 コンパイル時に全ての変数の型が判明している必要があるということです。コンパイラは通常、値と使用方法に基づいて、 使用したい型を推論してくれます。複数の型が推論される可能性がある場合、例えば、 -第2章の「予想と秘密の数字を比較する」節で`parse`メソッドを使って`String`型を数値型に変換した時のように、 +第2章の[「予想と秘密の数字を比較する」][comparing-the-guess-to-the-secret-number]節で`parse`メソッドを使って`String`型を数値型に変換した時のように、 複数の型が可能な場合には、型注釈をつけなければいけません。以下のようにですね: ```rust @@ -33,12 +34,12 @@ let guess: u32 = "42".parse().expect("Not a number!"); // 数字ではあり ``` -ここで型注釈を付けなければ、コンパイラは以下のエラーを表示し、これは可能性のある型のうち、 +上のコード中に示す`: u32`型注釈を付けなければ、コンパイラは以下のエラーを表示し、これは可能性のある型のうち、 どの型を使用したいのかを知るのに、コンパイラがプログラマからもっと情報を得る必要があることを意味します: ```console @@ -63,7 +64,7 @@ integers, floating-point numbers, Booleans, and characters. You may recognize these from other programming languages. Let’s jump into how they work in Rust. --> -スカラー型は、単独の値を表します。Rustには主に4つのスカラー型があります: +*スカラー*型は、単独の値を表します。Rustには主に4つのスカラー型があります: 整数、浮動小数点数、論理値、最後に文字です。他のプログラミング言語でも、これらの型を見かけたことはあるでしょう。 Rustでの動作方法に飛び込みましょう。 @@ -78,15 +79,14 @@ An *integer* is a number without a fractional component. We used one integer type in Chapter 2, the `u32` type. This type declaration indicates that the value it’s associated with should be an unsigned integer (signed integer types start with `i` instead of `u`) that takes up 32 bits of space. Table 3-1 shows -the built-in integer types in Rust. Each variant in the Signed and Unsigned -columns (for example, `i16`) can be used to declare the type of an integer -value. +the built-in integer types in Rust. We can use any of these variants to declare +the type of an integer value. --> -整数とは、小数部分のない数値のことです。第2章で一つの整数型を使用しましたね。`u32`型です。 +*整数*とは、小数部分のない数値のことです。第2章で一つの整数型を使用しましたね。`u32`型です。 この型定義は、紐付けられる値が、符号なし整数(符号付き整数は`u`ではなく、`i`で始まります)になり、 これは、32ビット分のサイズを取ります。表3-1は、Rustの組み込み整数型を表示しています。 -符号付きと符号なし欄の各バリアント(例: `i16`)を使用して、整数値の型を宣言することができます。 +これらのバリアントを使用して、整数値の型を宣言することができます。 | 大きさ | 符号付き | 符号なし | -|--------|---------|---------| -| 8-bit | `i8` | `u8` | -| 16-bit | `i16` | `u16` | -| 32-bit | `i32` | `u32` | -| 64-bit | `i64` | `u64` | -| arch | `isize` | `usize` | +|---------|----------|----------| +| 8-bit | `i8` | `u8` | +| 16-bit | `i16` | `u16` | +| 32-bit | `i32` | `u32` | +| 64-bit | `i64` | `u64` | +| 128-bit | `i128` | `u128` | +| arch | `isize` | `usize` | 各バリアントは、符号付きか符号なしかを選べ、明示的なサイズを持ちます。*符号付き*と*符号なし*は、 -数値が正負を持つかどうかを示します。つまり、数値が符号を持つ必要があるかどうか(符号付き)、または、 +数値が負の数になり得るかどうかを示します。つまり、数値が符号を持つ必要があるかどうか(符号付き)、または、 絶対に正数にしかならず符号なしで表現できるかどうか(符号なし)です。これは、数値を紙に書き下すのと似ています: 符号が問題になるなら、数値はプラス記号、またはマイナス記号とともに表示されます; しかしながら、 その数値が正数であると仮定することが安全なら、符号なしで表示できるわけです。符号付き数値は、 -2の補数表現で保持されます(これが何なのか確信を持てないのであれば、ネットで検索することができます。 -まあ要するに、この解説は、この本の範疇外というわけです)。 +[2の補数][twos-complement]表現で保持されます。 -加えて、`isize`と`usize`型は、プログラムが動作しているコンピュータの種類に依存します: +加えて、`isize`と`usize`型は、表では「arch」と表記していますが、プログラムが動作しているコンピュータのアーキテクチャに依存します: 64ビットアーキテクチャなら、64ビットですし、32ビットアーキテクチャなら、32ビットになります。 整数リテラル(`訳注`: リテラルとは、見たままの値ということ)は、表3-2に示すどの形式でも記述することができます。 -バイトリテラルを除く数値リテラルは全て、 -型接尾辞(例えば、`57u8`)と`_`を見た目の区切り記号(例えば、`1_000`)に付加することができます。 +複数の数値型になることができる数値リテラルは、型を指示するために型接尾辞をつけて、`57u8`のように書くことができます。 +数値リテラルはさらに、数値を読みやすくするために見た目の区切り記号として`_`をつけて、`1_000`のように書くこともできます。 +これは`1000`と指定した場合とまったく同じ値となるでしょう。 -| 数値リテラル | 例 | -|------------------|---------------| +| 数値リテラル | 例 | +|-------------------|---------------| | 10進数 | `98_222` | | 16進数 | `0xff` | | 8進数 | `0o77` | | 2進数 | `0b1111_0000` | -| バイト (`u8`だけ) | `b'A'` | +| バイト (`u8`だけ) | `b'A'` | では、どの整数型を使うべきかはどう把握すればいいのでしょうか?もし確信が持てないのならば、 -Rustの基準型は一般的にいい選択肢になります。整数型の基準は`i32`型です: 64ビットシステム上でも、 -この型が普通最速になります。`isize`と`usize`を使う主な状況は、何らかのコレクションにアクセスすることです。 +Rustの基準型は一般的にいい開始地点になります: 整数型の基準は`i32`型です。 +`isize`と`usize`を使う主な状況は、何らかのコレクションにアクセスすることです。 + + + +> ##### 整数オーバーフロー +> +> `u8`型の変数があるとしましょう。`u8`は0から255までの間の値を取ることができます。 +> この変数を範囲外の値、例えば256に変更しようとすると、*整数オーバーフロー (integer overflow)* が発生し、次の2つのうちのどちらかの挙動になります。 +> デバッグモードでコンパイルしているときは、もしこの挙動が発生したときは実行時にプログラムを*パニック (panic)* させるような、整数オーバーフローのチェックをコンパイラが入れ込みます。 +> プログラムがエラーとともに終了するとき、Rustは*パニック*という用語を使用します; +> パニックについては第9章の[「`panic!`で回復不能なエラー」][unrecoverable-errors-with-panic]でより深く議論します。 +> +> `--release`フラグを付けてリリースモードでコンパイルしているときは、コンパイラはパニックを引き起こす整数オーバーフローチェックを入れ込み*ません*。 +> 代わりに、オーバーフローが起きたときは、プログラムは*2の補数ラップアラウンド (two's complement wrapping)* を行います。 +> 一言で言うと、その型が取ることができる最大値よりも大きい値は、その型が取ることができる最小値に「回り込む」 (“wrap around”) のです。 +> `u8`の場合は、値256は0になり、値257は1になり、という感じです。 +> プログラムはパニックはしなくなるでしょうが、変数が持っている値はおそらくプログラマが期待していたものではないでしょう。 +> 整数オーバーフローのラップアラウンドの挙動に依存するのは、エラーと考えられます。 +> +> オーバーフローが発生する可能性を明示的に取り扱うためには、プリミティブ数値型に関して標準ライブラリが提供する、以下のメソッド群を使うことができます: +> +> * `wrapping_*`メソッド(`wrapping_add`等)で、モードを問わずラップアラウンドさせる。 +> * `checked_*`メソッドで、オーバーフローが発生する場合には`None`値を返す。 +> * `overflowing_*`メソッドで、値と、オーバーフローが発生したかどうかを示す論理値を返す。 +> * `saturating_*`メソッドで、値の最小値または最大値で飽和させる。(訳注: 結果が最大値を上回る場合は最大値に、最小値を下回る場合は最小値にするという意味です) Rustにはさらに、*浮動小数点数*に対しても、2種類の基本型があり、浮動小数点数とは数値に小数点がついたもののことです。 Rustの浮動小数点型は、`f32`と`f64`で、それぞれ32ビットと64ビットサイズです。基準型は`f64`です。 なぜなら、現代のCPUでは、`f32`とほぼ同スピードにもかかわらず、より精度が高くなるからです。 +すべての浮動小数点型は符号付きです。 Rustにも全数値型に期待されうる標準的な数学演算が用意されています: 足し算、引き算、掛け算、割り算、余りです。 -以下の例では、`let`文での各演算の使用方法をご覧になれます: +整数の割り算では、0に近い方の最も近い整数に切り捨てられます。 +以下の例では、`let`文での各数学演算の使用方法をご覧になれます: これらの文の各式は、数学演算子を使用しており、一つの値に評価され、そして、変数に束縛されます。 -付録BにRustで使える演算子の一覧が載っています。 +[付録B][appendix_b]にRustで使える演算子の一覧が載っています。 他の多くの言語同様、Rustの論理値型も取りうる値は二つしかありません: `true`と`false`です。 +論理値のサイズは1バイトです。 Rustの論理値型は、`bool`と指定されます。 例です: @@ -304,12 +368,12 @@ Rustの論理値型は、`bool`と指定されます。 論理値を使う主な手段は、条件式です。例えば、`if`式などですね。`if`式のRustでの動作方法については、 -「制御フロー」節で講義します。 +[「制御フロー」][control-flow]節で講義します。 -ここまで、数値型のみ扱ってきましたが、Rustには文字も用意されています。Rustの`char`型は、 -言語の最も基本的なアルファベット型であり、以下のコードでその使用方法の一例を見ることができます。 -(`char`は、ダブルクォーテーションマークを使用する文字列に対して、シングルクォートで指定されることに注意してください。) +Rustの`char`型は、言語の最も基本的なアルファベット型です。以下は`char`値を宣言するいくつかの例です: -Rustの`char`型は、ユニコードのスカラー値を表します。これはつまり、アスキーよりもずっとたくさんのものを表せるということです。 -アクセント文字; 中国語、日本語、韓国語文字; -絵文字; ゼロ幅スペースは、全てRustでは、有効な`char`型になります。ユニコードスカラー値は、 +`char`リテラルは、ダブルクォーテーションマークを使用する文字列リテラルに対して、シングルクォートで指定することに注意してください。 +Rustの`char`型は4バイトのサイズを持ち、ユニコードのスカラー値を表します。これはつまり、アスキーよりもずっとたくさんのものを表せるということです。 +アクセント記号付き文字; 中国語、日本語、韓国語の文字; +絵文字; ゼロ幅スペースはすべて、Rustでは有効な`char`値です。ユニコードスカラー値は、 `U+0000`から`U+D7FF`までと`U+E000`から`U+10FFFF`までの範囲になります。 ところが、「文字」は実はユニコードの概念ではないので、文字とは何かという人間としての直観は、 -Rustにおける`char`値が何かとは合致しない可能性があります。この話題については、第8章の「文字列」で詳しく議論しましょう。 +Rustにおける`char`値が何かとは合致しない可能性があります。この話題については、第8章の[「文字列でUTF-8でエンコードされたテキストを保持する」][strings]で詳しく議論しましょう。 #### タプル型 -タプルは、複数の型の何らかの値を一つの複合型にまとめ上げる一般的な手段です。 +*タプル*は、様々な型の複数の値を一つの複合型にまとめ上げる汎用的な手段です。 +タプルの長さは固定です: 一度宣言されたらサイズは伸縮できません。 @@ -424,7 +490,7 @@ use pattern matching to destructure a tuple value, like this: @@ -435,13 +501,11 @@ the single tuple into three parts. Finally, the program prints the value of プログラムは`y`変数の値を出力し、`6.4`と表示されます。 -パターンマッチングを通しての分配の他にも、アクセスしたい値の番号をピリオド(`.`)に続けて書くことで、 -タプルの要素に直接アクセスすることもできます。例です: +アクセスしたい値の番号をピリオド(`.`)に続けて書くことで、タプルの要素に直接アクセスすることもできます。例です: -このプログラムは、新しいタプル`x`を作成し、添え字アクセスで各要素に対して新しい変数も作成しています。 +このプログラムは、新しいタプル`x`を作成し、タプルの各要素にそれぞれの添え字を使ってアクセスしています。 多くのプログラミング言語同様、タプルの最初の添え字は0です。 + + +値をひとつも持たないタプルは*ユニット*という特別な名前を持っています。 +この値と、それに対応する型はともに`()`と書き表され、空の値や空の戻り値型を表現します。 +式は、特に値を返さなければ、暗黙的にユニット値を返します。 + @@ -470,21 +545,19 @@ index in a tuple is 0. *配列*によっても、複数の値のコレクションを得ることができます。タプルと異なり、配列の全要素は、 -同じ型でなければなりません。Rustの配列は、他の言語と異なっています。Rustの配列は、 -固定長なのです: 一度宣言されたら、サイズを伸ばすことも縮めることもできません。 +同じ型でなければなりません。一部の他の言語の配列と異なり、Rustの配列は固定長です。 -Rustでは、配列に入れる要素は、角かっこ内にカンマ区切りリストとして記述します: +配列内の要素は、角かっこ内にカンマ区切りリストとして記述します: -配列は、ヒープよりもスタック(スタックとヒープについては第4章で(つまび)らかに議論します)にデータのメモリを確保したい時、 +配列は、ヒープよりもスタック(スタックとヒープについては[第4章][stack-and-heap]で(つまび)らかに議論します)にデータのメモリを確保したい時、 または、常に固定長の要素があることを確認したい時に有効です。 -ただ、配列は、ベクタ型ほど柔軟ではありません。ベクタは、標準ライブラリによって提供されている配列と似たようなコレクション型で、 +ただ、配列は、ベクタ型ほど柔軟ではありません。*ベクタ*は、標準ライブラリによって提供されている配列と似たようなコレクション型で、 こちらは、サイズを伸縮させることが*できます*。配列とベクタ型、どちらを使うべきか確信が持てない時は、 -おそらくベクタ型を使うべきです。第8章でベクタについて詳細に議論します。 +おそらくベクタ型を使うべきです。[第8章][vectors]でベクタについて詳細に議論します。 -ベクタ型よりも配列を使いたくなるかもしれない例は、1年の月の名前を扱うプログラムです。そのようなプログラムで、 -月を追加したり削除したりすることまずないので、配列を使用できます。常に12個要素があることもわかってますからね: +しかしながら、要素数を変えられる必要はないだろうと分かっている場合は、配列のほうが便利です。 +例えば、プログラム中で月の名前を使おうとしているなら、おそらくベクタよりも配列を使うのが良いでしょう。 +常に12個要素があることもわかってますからね: ```rust let months = ["January", "February", "March", "April", "May", "June", "July", @@ -572,12 +647,13 @@ more concise way. ##### 配列の要素にアクセスする -配列は、スタック上に確保される一塊のメモリです。添え字によって、 -配列の要素にこのようにアクセスすることができます: +配列は、あらかじめ知られた固定サイズを持ち、スタック上に確保することができる一塊のメモリです。 +添え字によって、配列の要素にこのようにアクセスすることができます: この例では、`first`という名前の変数には`1`という値が格納されます。配列の`[0]`番目にある値が、 @@ -605,13 +681,13 @@ get the value `2` from index `[1]` in the array. ##### 配列要素への無効なアクセス -配列の終端を越えて要素にアクセスしようとしたら、どうなるでしょうか? -先ほどの例を以下のように変えたとすると、コンパイルは通りますが、実行するとエラーで終了します: +配列の終端を越えて要素にアクセスしようとしたらどうなるか、見てみましょう。 +第2章の数当てゲームと同じようにユーザから配列の添え字を受け取る、次のコードを実行する場合を考えてみてください: -このコードはコンパイルされます。`cargo run`で走らせ、0, 1, 2, 3, または4をこのプログラムに入力すると配列の対応する値を出力します。もし配列の末尾を超えるような、例えば10などの数字を与えると、次のような出力が表示されます。 +このコードはコンパイルされます。`cargo run`で走らせ、`0`, `1`, `2`, `3`, または`4`をこのプログラムに入力すると配列の対応する値を出力します。 +もし配列の末尾を超えるような、例えば`10`などの数字を与えると、次のような出力が表示されます。 ```console -thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19 -スレッド'main'は'範囲外アクセス: 長さは5ですが、添え字は10でした', src/main.rs:19:19 -でパニックしました +thread 'main' panicked at src/main.rs:19:19: +index out of bounds: the len is 5 but the index is 10 +(スレッド'main'はsrc/main.rs:19:19でパニックしました: +範囲外アクセス: 長さは5ですが、添え字は10でした) note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` -コンパイルでは何もエラーが出なかったものの、プログラムは*実行時*エラーに陥り、 -正常終了しませんでした。要素に添え字アクセスを試みると、言語は、 -指定されたその添え字が配列長よりも小さいかを確認してくれます。添え字が配列長よりも大きければ、言語は*パニック*します。 -パニックとは、プログラムがエラーで終了したことを表すRust用語です。 +プログラムは、添え字アクセスで無効な値を使用した時点で*実行時*エラーに陥りました。 +プログラムはエラーメッセージとともに終了し、最後の`println!`文を実行しませんでした。 +要素に添え字アクセスを試みると、言語は、指定されたその添え字が配列長よりも小さいかを確認してくれます。 +添え字が配列長と等しいかより大きければ、言語は*パニック*します。 +この例の場合は特にそうですが、このチェックは実行時に行われなくてはなりません。 +なぜならコンパイラは、ユーザが後でコードを実行したときに、ユーザがどんな値を入力するか知りようがないからです。 -これは、実際に稼働しているRustの安全機構の最初の例になります。低レベル言語の多くでは、 +これは、実際に稼働しているRustのメモリ安全機構の例のひとつになります。低レベル言語の多くでは、 この種のチェックは行われないため、間違った添え字を与えると、無効なメモリにアクセスできてしまいます。 Rustでは、メモリアクセスを許可し、処理を継続する代わりに即座にプログラムを終了することで、 -この種のエラーからプログラマを保護しています。Rustのエラー処理については、第9章でもっと議論します。 +この種のエラーからプログラマを保護しています。第9章ではRustのエラー処理について、そして、 +可読性が高く安全で、パニックもしなければ不正なメモリアクセスも許さないコードをどうすれば書けるのか、もっと議論します。 + + + +[comparing-the-guess-to-the-secret-number]: +ch02-00-guessing-game-tutorial.html#予想と秘密の数字を比較する +[twos-complement]: https://ja.wikipedia.org/wiki/2の補数 +[control-flow]: ch03-05-control-flow.html#制御フロー +[strings]: ch08-02-strings.html#文字列でutf-8でエンコードされたテキストを保持する +[stack-and-heap]: ch04-01-what-is-ownership.html#スタックとヒープ +[vectors]: ch08-01-vectors.html +[unrecoverable-errors-with-panic]: ch09-01-unrecoverable-errors-with-panic.html +[appendix_b]: appendix-02-operators.md diff --git a/src/ch03-03-how-functions-work.md b/src/ch03-03-how-functions-work.md index 8c16385ff..a15a56588 100644 --- a/src/ch03-03-how-functions-work.md +++ b/src/ch03-03-how-functions-work.md @@ -5,7 +5,7 @@ ## 関数 @@ -36,12 +36,12 @@ Rustの関数と変数の命名規則は、*スネークケース*(`訳注`: som ``` -Rustにおいて関数定義は、`fn`キーワードで始まり、関数名の後に丸かっこの組が続きます。 +Rustでは、`fn`に続けて関数名と丸かっこの組を入力して関数を定義します。 波かっこが、コンパイラに関数本体の開始と終了の位置を伝えます。 定義した関数は、名前に丸かっこの組を続けることで呼び出すことができます。 `another_function`関数がプログラム内で定義されているので、`main`関数内から呼び出すことができるわけです。 ソースコード中で`another_function`を`main`関数の*後*に定義していることに注目してください; 勿論、main関数の前に定義することもできます。コンパイラは、関数がどこで定義されているかは気にしません。 -どこかで定義されていることのみ気にします。 +呼び出し元から見えるスコープ内のどこかで定義されていることのみ気にします。 行出力は、`main`関数内に書かれた順序で実行されています。最初に"Hello, world"メッセージが出て、 それから`another_function`が呼ばれて、こちらのメッセージが出力されています。 -### 関数の引数 +### 引数 -関数は、引数を持つようにも定義できます。引数とは、関数シグニチャの一部になる特別な変数のことです。 -関数に引数があると、引数の位置に実際の値を与えることができます。技術的にはこの実際の値は -*実引数*と呼ばれますが、普段の会話では、仮引数("parameter")と実引数("argument")を関数定義の変数と関数呼び出し時に渡す実際の値、 -両方の意味に区別なく使います(`訳注`: 日本語では、特別区別する意図がない限り、どちらも単に引数と呼ぶことが多いでしょう)。 +関数は、*仮引数 (parameter)* を持つよう定義することもできます。仮引数とは、関数シグニチャの一部になる特別な変数のことです。 +関数に仮引数があると、仮引数に対して具体的な値を与えることができます。 +厳密にはこの具体的な値は*実引数 (argument)* と呼ばれますが、普段の会話では、関数定義内の変数と関数呼び出し時に渡す実際の値の両方の意味で、 +*parameter*と*argument*を区別なく使う傾向にあります (`訳注`: 日本語では、特別区別する意図がない限り、どちらも単に*引数*と呼ぶことが多いでしょう)。 -以下の書き直した`another_function`では、Rustの仮引数がどのようなものかを示しています: +次の版の`another_function`では、仮引数を追加しています: `another_function`の宣言には、`x`という名前の仮引数があります。`x`の型は、 -`i32`と指定されています。値`5`が`another_function`に渡されると、`println!`マクロにより、 -フォーマット文字列中の1組の波かっこがあった位置に値`5`が出力されます。 +`i32`と指定されています。値`5`を`another_function`に渡すと、`println!`マクロにより、 +フォーマット文字列中の`x`を含む1組の波かっこがあった位置に値`5`が出力されます。 関数シグニチャにおいて、各仮引数の型を宣言しなければ*なりません*。これは、Rustの設計において、 -意図的な判断です: 関数定義で型注釈が必要不可欠ということは、コンパイラがその意図するところを推し量るのに、 +意図的な判断です: 関数定義で型注釈が必要不可欠ということは、コンパイラがその意図する型を推し量るのに、 プログラマがコードの他の箇所で使用する必要がないということを意味します。 +コンパイラも、関数が期待する型を知っていれば、より役に立つエラーメッセージを与えることができます。 -関数に複数の仮引数を持たせたいときは、仮引数定義をカンマで区切ってください。 +関数に複数の仮引数を定義したいときは、仮引数定義をカンマで区切ってください。 こんな感じです: -この例では、2引数の関数を生成しています。そして、引数はどちらも`i32`型です。それからこの関数は、 -仮引数の値を両方出力します。関数引数は、全てが同じ型である必要はありません。今回は、 -偶然同じになっただけです。 +この例では、`print_labeled_measurement`という名前の2引数の関数を生成しています。 +第1引数は`value`という名前で`i32`です。第2引数は`unit_label`という名前で`char`型です。 +この関数は`value`と`unit_label`の両方を含むテキストを出力します。 -`x`に対して値`5`、`y`に対して値`6`を渡して関数を呼び出したので、この二つの文字列は、 -この値で出力されました。 +`value`に対して値`5`、`unit_label`に対して値`'h'`を渡して関数を呼び出したので、 +プログラムの出力にはこれらの値が含まれます。 - - -### 関数本体は、文と式を含む +### 文と式 -関数本体は、文が並び、最後に式を置くか文を置くという形で形成されます。現在までには、 -式で終わらない関数だけを見てきたわけですが、式が文の一部になっているものなら見かけましたね。Rustは、式指向言語なので、 +関数本体は、文が並び、最後に式を置くか文を置くという形で形成されます。今のところ、 +私たちが見てきた関数は式で終わることはありませんでしたが、式が文の一部になっているものなら見かけましたね。Rustは、式指向言語なので、 これは理解しておくべき重要な差異になります。他の言語にこの差異はありませんので、文と式がなんなのかと、 その違いが関数本体にどんな影響を与えるかを見ていきましょう。 -実のところ、もう文と式は使っています。*文*とは、なんらかの動作をして値を返さない命令です。 -*式*は結果値に評価されます。ちょっと例を眺めてみましょう。 +* *文 (statement)* はなんらかの動作をして値を返さない命令です。 +* *式 (expression)* は結果値に評価されます。ちょっと例を眺めてみましょう。 +実のところ、もう文と式は使っています。 `let`キーワードを使用して変数を生成し、値を代入することは文になります。 リスト3-1で`let y = 6;`は文です。 @@ -273,7 +272,7 @@ asは前の文にかかるべきだが、大して意味が変わらないので 文は値を返しません。故に、`let`文を他の変数に代入することはできません。 @@ -314,19 +313,19 @@ CやRubyなどの言語とは異なる動作です。CやRubyでは、代入は そうは問屋が卸さないわけです。 -式は何かに評価され、これからあなたが書くRustコードの多くを構成します。 -簡単な数学演算(`5 + 6`など)を思い浮かべましょう。この例は、値`11`に評価される式です。式は文の一部になりえます: +式は値に評価され、これからあなたが書くRustコードの多くを構成します。 +数学演算(`5 + 6`など)を思い浮かべましょう。この例は、値`11`に評価される式です。式は文の一部になりえます: リスト3-1において、`let y = 6`という文の`6`は値`6`に評価される式です。関数呼び出しも式です。マクロ呼び出しも式です。 -新しいスコープを作る際に使用するブロック(`{}`)も式です: +波括弧で作られる新しいスコープも式です: は今回の場合、`4`に評価されるブロックです。その値が、`let`文の一部として`y`に束縛されます。 -今まで見かけてきた行と異なり、文末にセミコロンがついていない`x + 1`の行に気をつけてください。 +今まで見かけてきた行と異なり、`x + 1`の行には文末にセミコロンがついていないことに気をつけてください。 式は終端にセミコロンを含みません。式の終端にセミコロンを付けたら、文に変えてしまいます。そして、文は値を返しません。 次に関数の戻り値や式を見ていく際にこのことを肝に銘じておいてください。 @@ -373,16 +373,16 @@ Keep this in mind as you explore function return values and expressions next. 関数は、それを呼び出したコードに値を返すことができます。戻り値に名前を付けはしませんが、 -矢印(`->`)の後に型を書いて確かに宣言します。Rustでは、関数の戻り値は、関数本体ブロックの最後の式の値と同義です。 +矢印(`->`)の後に型を書いて宣言する必要があります。Rustでは、関数の戻り値は、関数本体ブロックの最後の式の値と同義です。 `return`キーワードで関数から早期リターンし、値を指定することもできますが、多くの関数は最後の式を暗黙的に返します。 こちらが、値を返す関数の例です: @@ -399,7 +399,7 @@ returns a value: @@ -437,7 +437,7 @@ because it’s an expression whose value we want to return. なぜなら、これが返したい値になる式だからです。 もう一つ別の例を見ましょう: @@ -455,7 +455,7 @@ Let's look at another example: このコードを走らせると、`The value of x is: 6`と出力されるでしょう。しかし、 @@ -472,27 +472,27 @@ expression to a statement, we'll get an error: ``` -このコードを実行すると、以下のようにエラーが出ます: +このコードをコンパイルすると、以下のようにエラーが出ます: ```console {{#include ../listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/output.txt}} ``` -メインのエラーメッセージである「型が合いません」でこのコードの根本的な問題が明らかになるでしょう。 +メインのエラーメッセージである`mismatched types (型が合いません)`でこのコードの根本的な問題が明らかになるでしょう。 関数`plus_one`の定義では、`i32`型を返すと言っているのに、文は値に評価されないからです。このことは、 -`()`、つまり空のタプルとして表現されています。それゆえに、何も戻り値がなく、これが関数定義と矛盾するので、 +`()`、つまりユニット型として表現されています。それゆえに、何も戻り値がなく、これが関数定義と矛盾するので、 結果としてエラーになるわけです。この出力内で、コンパイラは問題を修正する手助けになりそうなメッセージも出していますね: セミコロンを削除するよう提言しています。そして、そうすれば、エラーは直るわけです。 diff --git a/src/ch03-04-comments.md b/src/ch03-04-comments.md index c3d0ad086..22a08329c 100644 --- a/src/ch03-04-comments.md +++ b/src/ch03-04-comments.md @@ -6,13 +6,13 @@ 全プログラマは、自分のコードがわかりやすくなるよう努めますが、時として追加の説明が許されることもあります。 -このような場合、プログラマは注釈または*コメント*をソースコードに残し、コメントをコンパイラは無視しますが、 +このような場合、プログラマは*コメント*をソースコードに残し、コメントをコンパイラは無視しますが、 ソースコードを読む人間には有益なものと思えるでしょう。 -Rustでは、コメントは2連スラッシュで始め、行の終わりまで続きます。コメントが複数行にまたがる場合、 +Rustの慣用的なコメントスタイルでは、コメントは2連スラッシュで始め、行の終わりまで続きます。コメントが複数行にまたがる場合、 各行に`//`を含める必要があります。こんな感じに: ```rust @@ -48,7 +48,11 @@ Comments can also be placed at the end of lines containing code: コメントは、コードが書かれた行の末尾にも配置することができます: + + +ファイル名: src/main.rs ```rust {{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-24-comments-end-of-line/src/main.rs}} @@ -56,11 +60,15 @@ Comments can also be placed at the end of lines containing code: しかし、こちらの形式のコメントの方が見かける機会は多いでしょう。注釈しようとしているコードの1行上に書く形式です: + + ファイル名: src/main.rs ```rust @@ -69,7 +77,10 @@ separate line above the code it's annotating: -Rustには他の種類のコメント、ドキュメントコメントもあり、それについては第14章で議論します。 +Rustには他の種類のコメント、ドキュメントコメントもあり、それについては第14章の[「Crates.ioにクレートを公開する」][publishing]節で議論します。 + +[publishing]: ch14-02-publishing-to-crates-io.html diff --git a/src/ch03-05-control-flow.md b/src/ch03-05-control-flow.md index 71397a24c..a34b56683 100644 --- a/src/ch03-05-control-flow.md +++ b/src/ch03-05-control-flow.md @@ -5,15 +5,14 @@ ## 制御フロー -条件が真かどうかによってコードを走らせるかどうかを決定したり、 -条件が真の間繰り返しコードを走らせるか決定したりすることは、多くのプログラミング言語において、基本的な構成ブロックです。 +条件が`true`かどうかによってコードを走らせたり、 +条件が`true`の間繰り返しコードを走らせたりできることは、多くのプログラミング言語において、基本的な構成ブロックです。 Rustコードの実行フローを制御する最も一般的な文法要素は、`if`式とループです。 @@ -50,31 +49,27 @@ the `if` expression. In the *src/main.rs* file, input the following: ``` - - `if`式は全て、キーワードの`if`から始め、条件式を続けます。今回の場合、 条件式は変数`number`が5未満の値になっているかどうかをチェックします。 -条件が真の時に実行したい一連のコードを条件式の直後に波かっこで包んで配置します。`if`式の条件式と紐付けられる一連のコードは、 +条件が`true`の時に実行する一連のコードを条件式の直後に波かっこで包んで配置します。`if`式の条件式と紐付けられる一連のコードは、 時として*アーム*と呼ばれることがあります。 -第2章の「予想と秘密の数字を比較する」の節で議論した`match`式のアームと同じです。 +第2章の[「予想と秘密の数字を比較する」][comparing-the-guess-to-the-secret-number]の節で議論した`match`式のアームと同じです。 @@ -180,11 +175,11 @@ Running this code will print `number was something other than zero`. #### `else if`で複数の条件を扱う -`if`と`else`を組み合わせて`else if`式にすることで複数の条件を持たせることもできます。例です: +`if`と`else`を組み合わせて`else if`式にすることで複数の条件を使うこともできます。例です: -このプログラムを実行すると、`if`式が順番に吟味され、最初に条件が真になった本体が実行されます。 -6は2で割り切れるものの、`number is devisible by 2`や、 +このプログラムを実行すると、`if`式が順番に吟味され、最初に条件が`true`に評価された本体が実行されます。 +6は2で割り切れるものの、`number is divisible by 2`や、 `else`ブロックの`number is not divisible by 4, 3, or 2`という出力はされないことに注目してください。 -それは、Rustが最初の真条件のブロックのみを実行し、 +それは、Rustが最初の`true`な条件のブロックのみを実行し、 条件に合ったものが見つかったら、残りはチェックすらしないからです。 -`if`は式なので、`let`文の右辺に持ってくることができます。リスト3-2のようにですね。 +`if`は式なので、`let`文の右辺に持ってきて結果を変数に代入することができます。リスト3-2のようにですね。 + リスト3-2: `if`式の結果を変数に代入する @@ -278,7 +275,7 @@ whole `if` expression depends on which block of code executes. This means the values that have the potential to be results from each arm of the `if` must be the same type; in Listing 3-2, the results of both the `if` arm and the `else` arm were `i32` integers. If the types are mismatched, as in the following -example, we'll get an error: +example, we’ll get an error: --> 一連のコードは、そのうちの最後の式に評価され、数値はそれ単独でも式になることを思い出してください。 @@ -313,17 +310,17 @@ find the problem in the program: `if`ブロックの式は整数に評価され、`else`ブロックの式は文字列に評価されます。これでは動作しません。 -変数は単独の型でなければならないからです。コンパイラは、コンパイル時に`number`変数の型を確実に把握する必要があるため、 -コンパイル時に`number`が使われている箇所全部で型が有効かどうか検査することができるのです。 +変数は単独の型でなければならず、コンパイラは、コンパイル時に`number`変数の型を確実に把握する必要があるからです。 +`number`の型を把握していることで、コンパイラは、コンパイル時に`number`が使われている箇所全部で型が有効であるか検証できるのです。 `number`の型が実行時にしか決まらないのであれば、コンパイラはそれを実行することができなくなってしまいます; どの変数に対しても、架空の複数の型があることを追いかけなければならないのであれば、コンパイラはより複雑になり、 コードに対して行える保証が少なくなってしまうでしょう。 @@ -336,9 +333,9 @@ multiple hypothetical types for any variable. 一連のコードを1回以上実行できると、しばしば役に立ちます。この作業用に、 @@ -384,19 +381,25 @@ like this: このプログラムを実行すると、プログラムを手動で止めるまで、何度も何度も続けて`again!`と出力するでしょう。 ほとんどの端末でctrl-cというショートカットが使え、 -永久ループに囚われてしまったプログラムを終了させられます。試しにやってみましょう: +永久ループに囚われてしまったプログラムに割り込むことができます。試しにやってみましょう: + + ```console $ cargo run Compiling loops v0.1.0 (file:///projects/loops) - Finished dev [unoptimized + debuginfo] target(s) in 0.29 secs + Finished dev [unoptimized + debuginfo] target(s) in 0.29s Running `target/debug/loops` again! again! @@ -406,25 +409,27 @@ again! ``` `^C`という記号が出た場所が、ctrl-cを押した場所です。`^C`の後には`again!`と表示されたり、 -されなかったりします。ストップシグナルをコードが受け取った時にループのどこにいたかによります。 +されなかったりします。割り込みシグナルをコードが受け取った時にループのどこにいたかによります。 -幸いなことに、Rustにはループを抜け出す別のより信頼できる手段があります。 +幸いなことに、Rustにはコードによってループを抜け出す手段もあります。 ループ内に`break`キーワードを配置することで、プログラムに実行を終了すべきタイミングを教えることができます。 -第2章の「正しい予想をした後に終了する」節の数当てゲーム内でこれをして、ユーザが予想を的中させ、 +第2章の[「正しい予想をした後に終了する」][quitting-after-a-correct-guess]節の数当てゲーム内でこれをして、ユーザが予想を的中させ、 ゲームに勝った時にプログラムを終了させたことを思い出してください。 + +#### ループから値を返す + + + +`loop`の使用法のひとつとして、失敗するかもしれないと分かっている操作、 +例えばスレッドがそのジョブを完了したかを確認する操作などを、リトライするというのがあります。 +さらに、コードの他の部分で使うために、ループの外に操作の結果を渡す必要があるかもしれません。 +これを行うには、ループを止めるために使っている`break`式の後ろに、返したい値を付け加えてください; +その値はループを抜けて返され、使うことができます。このように: + +```rust +{{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-33-return-value-from-loop/src/main.rs}} +``` + + + +ループの前で`counter`という変数を宣言し、`0`に初期化しています。 +次に、ループから返された値を保持するために、`result`という変数を宣言しています。 +ループの繰り返しごとに、`counter`変数に`1`を追加し、`counter`が`10`に等しいかチェックします。 +等しい場合は、値`counter * 2`とともに`break`キーワードを使用しています。 +ループの後には、値を`result`に代入する文を終了するためのセミコロンが使われています。 +最後に、`result`の値を出力していて、この場合は`20`です。 + + + +#### 複数のループを区別するループラベル + ループ内にループがある場合、`break`と`continue`は最も内側のループに適用されます。 *ループラベル*を使用することで、`break`や`continue`が適用されるループを指定することができます。 +ループラベルはシングルクオートで始める必要があります。 以下に例を示します。 @@ -477,28 +531,23 @@ doesn’t specify a label will exit the inner loop only. The `break #### `while`で条件付きループ -プログラムにとってループ内で条件式を評価できると、有益なことがしばしばあります。条件が真の間、 -ループが走るわけです。条件が真でなくなった時にプログラムは`break`を呼び出し、ループを終了します。 -このタイプのループは、`loop`、`if`、`else`、`break`を組み合わせることでも実装できます; +プログラムは、ループ内で条件式を評価することがよく必要になるでしょう。条件が`true`の間、 +ループが走るわけです。条件が`true`でなくなった時にプログラムは`break`を呼び出し、ループを終了します。 +このような挙動は、`loop`、`if`、`else`、`break`を組み合わせることでも実装できます; お望みなら、プログラムで今、試してみるのもいいでしょう。 - - - しかし、このパターンは頻出するので、Rustにはそれ用の文法要素が用意されていて、`while`ループと呼ばれます。 -リスト3-3は、`while`を使用しています: プログラムは3回ループし、それぞれカウントダウンします。 -それから、ループ後に別のメッセージを表示して終了します: +リスト3-3では、プログラムを3回ループさせるために`while`を使用しています。 +繰り返しごとにカウントダウンして、ループ後にメッセージを表示して終了します。 この文法要素により、`loop`、`if`、`else`、`break`を使った時に必要になるネストがなくなり、 -より明確になります。条件が真の間、コードは実行されます; そうでなければ、ループを抜けます. +より明確になります。条件が`true`に評価される間、コードは実行されます; そうでなければ、ループを抜けます. -`while`要素を使って配列などのコレクションの要素を覗き見ることができます。例えば、リスト3-4を見ましょう。 +配列などのコレクションの要素を覗き見るために、`while`要素を使うこともできます。 +例えば、リスト3-4のループは配列`a`の各要素を出力します。 ここで、コードは配列の要素を順番にカウントアップして覗いています。番号0から始まり、 -配列の最終番号に到達するまでループします(つまり、`index < 5`が真でなくなる時です)。 +配列の最終番号に到達するまでループします(つまり、`index < 5`が`true`でなくなる時です)。 このコードを走らせると、配列内の全要素が出力されます: ```console @@ -581,23 +632,26 @@ to fetch a sixth value from the array. 配列から6番目の値を拾おうとする前にループは実行を終了します。 -しかし、このアプローチは間違いが発生しやすいです; 添え字の長さが間違っていれば、 -プログラムはパニックしてしまいます。また遅いです。 -コンパイラが実行時にループの各回ごとに境界値チェックを行うようなコードを追加するからです。 +しかし、このアプローチは間違いが発生しやすいです; 添え字の値や判定条件が間違っていれば、 +プログラムはパニックしてしまいます。例えば、`a`配列の定義を4要素を持つように変更したのに、 +条件を`while index < 4`に更新し忘れた場合、コードはパニックするでしょう。また遅いです。 +実行時にループの各回ごとに添字が配列の境界内にあるかチェックするコードを、コンパイラが追加するからです。 -より効率的な対立案として、`for`ループを使ってコレクションの各アイテムに対してコードを実行することができます。 -`for`ループはリスト3-5のこんな見た目です。 +より簡潔な対立案として、`for`ループを使ってコレクションの各アイテムに対してコードを実行することができます。 +`for`ループはリスト3-5のコードのようになります。 -例えば、リスト3-4のコードで、`a`配列からアイテムを1つ削除したのに、条件式を`while index < 4`にするのを忘れていたら、 -コードはパニックします。`for`ループを使っていれば、配列の要素数を変えても、 -他のコードをいじることを覚えておく必要はなくなるわけです。 +`for`ループを使っていれば、配列の要素数を変えても、 +リスト3-4で使った方法のように他のコードをいじることを覚えておく必要はなくなるわけです。 `for`ループのこの安全性と簡潔性により、Rustで使用頻度の最も高いループになっています。 リスト3-3で`while`ループを使ったカウントダウンサンプルのように、一定の回数、同じコードを実行したいような状況であっても、 多くのRustaceanは、`for`ループを使うでしょう。どうやってやるかといえば、 -`Range`型を使うのです。Range型は、標準ライブラリで提供される片方の数字から始まって、 +標準ライブラリで提供される`Range`型を使うのです。`Range`型は、片方の数字から始まって、 もう片方の数字未満の数値を順番に生成する型です。 やりましたね!結構長い章でした: 変数、スカラー値と複合データ型、関数、コメント、`if`式、そして、ループについて学びました! -この章で議論した概念について経験を積みたいのであれば、以下のことをするプログラムを組んでみてください: +この章で議論した概念について経験を積むために、以下のことをするプログラムを組んでみてください: * 温度を華氏と摂氏で変換する。 -* フィボナッチ数列のn番目を生成する。 +* フィボナッチ数列の*n*番目を生成する。 * クリスマスキャロルの定番、"The Twelve Days of Christmas"の歌詞を、 曲の反復性を利用して出力する。 @@ -711,3 +763,15 @@ commonly exist in other programming languages: ownership. --> 次に進む準備ができたら、他の言語にはあまり存在*しない*Rustの概念について話しましょう: 所有権です。 + + + +[comparing-the-guess-to-the-secret-number]: +ch02-00-guessing-game-tutorial.html#予想と秘密の数字を比較する +[quitting-after-a-correct-guess]: +ch02-00-guessing-game-tutorial.html#正しい予想をした後に終了する diff --git a/src/ch09-02-recoverable-errors-with-result.md b/src/ch09-02-recoverable-errors-with-result.md index 65be5fb61..489e7aef7 100644 --- a/src/ch09-02-recoverable-errors-with-result.md +++ b/src/ch09-02-recoverable-errors-with-result.md @@ -25,7 +25,7 @@ defined as having two variants, `Ok` and `Err`, as follows: 第2章の[「`Result`型で失敗する可能性に対処する」][handle_failure]で`Result` enumが以下のように、 `Ok`と`Err`の2列挙子からなるよう定義されていることを思い出してください: -[handle_failure]: ch02-00-guessing-game-tutorial.html#result型で失敗の可能性を扱う +[handle_failure]: ch02-00-guessing-game-tutorial.html#resultで失敗の可能性を扱う ```rust enum Result {