å°ããªãããžã§ã¯ãã«åãçµãã§Rustãç¥ããïŒ Rustã®åºæ¬æŠå¿µãå®éã®äŸã§ç€ºããŸãã let
ã match
ãã¡ãœãããé¢é£é¢æ°ããµãŒãããŒãã£ã©ã€ãã©ãªã®æ¥ç¶ãªã©ã«ã€ããŠåŠã³ãŸãã ã²ãŒã ãæšæž¬ãããšããå€å
žçãªã¿ã¹ã¯ãå®çŸããŠããŸãã
- ããã°ã©ã ã¯1ãã100ãŸã§ã®ä¹±æ°ãçæããŸãã
- ãã®åŸã圌ã¯ãã¬ã€ã€ãŒã«æšæž¬ãå
¥åããããã«é Œã¿ãŸãã
- ãã®åŸãããã°ã©ã ã¯ãã¬ãŒã€ãŒã«éç¥ããŸãã
- 圌ãæ°åãæšæž¬ããããã²ãŒã ã¯çµäºããŸã
- ããã§ãªãå ŽåïŒ
- æžã蟌ã¿ãæšæž¬ãããæ°ãããå°ãªãããæšæž¬ãããæ°ããå€ãã
- ã¹ããã2ã«é²ã¿ãŸãã
æ°ãããããžã§ã¯ããäœæãã
æ°ãããããžã§ã¯ããäœæããã«ã¯ïŒ
$ cargo new guessing_game
æåã®cargo new
ã³ãã³ãã¯ãããã°ã©ã ã®ååïŒ guessing_game
ïŒãæåã®åŒæ°ãšããŠåãåããŸãã --bin
ã¯ãïŒã©ã€ãã©ãªã§ã¯ãªãïŒããã°ã©ã ãäœæããããã®ãããžã§ã¯ããæºåããããCargoã«æ瀺ããŸãã ãããžã§ã¯ãæ§æãã¡ã€ã«-Cargo.tomlã«ãããã®ãèŠãŠã¿ãŸããã
[package] name = "guessing_game" version = "0.1.0" authors = ["Your Name <you@example.com>"] [dependencies]
Cargoãã·ã¹ãã ããåãåã£ãäœæè
æ
å ±ãæ£ãããªãå Žåã¯ãæ§æãã¡ã€ã«ãä¿®æ£ããŠä¿åããŸãã ããã©ã«ãã§ã¯ãæ°ãããããžã§ã¯ãã«ã¯ãHelloãworldããå«ãŸããŠããŸãã
src / main.rs
fn main() { println!("Hello, world!"); }
ããã°ã©ã ããã«ãããŠå®è¡ããŸãããïŒ
$ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 1.50 secs Running `target/debug/guessing_game` Hello, world!
run
ã³ãã³ãã¯ãã³ã³ãã€ã«ããã«ããèµ·åã®åãã§ãŒãºãé çªã«ç¹°ãè¿ãããšãå€ãå Žåã«éåžžã«åœ¹ç«ã¡ãŸãã
æšæž¬åŠç
ããã°ã©ã ã®æåã®éšåã§ã¯ããŠãŒã¶ãŒã«æšæž¬ãå
¥åããå
¥åãåŠçããŠãæ£ããããšã確èªããŸãã ãŸãããŠãŒã¶ãŒãæšæž¬ãå
¥åã§ããããã«ããŸãã以éããã¹ãŠã®å€æŽã¯src/main.rs
ã«å¯ŸããŠè¡ããsrc/main.rs
ã
ã³ãŒãã«ã¯å€ãã®æ
å ±ãå«ãŸããŠãããããåŸã
ã«æ€èšããŠãã ããã å
¥åãããæšæž¬ããŠãŒã¶ãŒããåãåããstdoutã§æšæž¬ããã«ã¯ã io
ã©ã€ãã©ãªãã°ããŒãã«ã¹ã³ãŒãã«è¿œå ããå¿
èŠããããŸã ã io
ã¯ãæšæºã©ã€ãã©ãªïŒä»¥äžstd
ãŸãïŒã®äžéšã§ãã
use std::io;
ããã©ã«ãã§ã¯ãRustã¯ããã°ã©ã ã¹ã³ãŒãã«ããã€ãã®ã¿ã€ãã®ã¿ããããããŸãïŒ prelude
ïŒã prelude
å¿
èŠãªã¿ã€ãããªãå Žåã¯ã use
ã¹ããŒãã¡ã³ããèšè¿°ããŠã¹ã³ãŒãã«æåã§è¿œå ããå¿
èŠããããŸãã std::io
ã䜿çšãããšããŠãŒã¶ãŒå
¥åãèªã¿åãæ©èœãªã©ãå
¥åºåïŒ IO ïŒãæäœããããã®å€ãã®æ©èœãæäŸãããŸãã main
é¢æ°ïŒCããã³C ++ãªã©ïŒã¯ãããã°ã©ã ãžã®ãšã³ããªãã€ã³ãã§ãã
fn main() {
fn
䜿çšãããšãæ°ããé¢æ°ã宣èšã§ããŸãã ()
ã¯ãé¢æ°ããã©ã¡ãŒã¿ãŒãåãå
¥ããªãããšã瀺ãã {
ã¯é¢æ°ã®æ¬äœã®åã«ãããŸãã println!
-ã³ã³ãœãŒã«ã«æååã衚瀺ãããã¯ãïŒ macro
ïŒïŒ
println!("Guess the number!");
å€æ°ã«å€ãä¿åããŸã
次ã«ããŠãŒã¶ãŒå
¥åãä¿åãããå ŽæãäœæããŸãã
let mut guess = String::new();
å€æ°ãäœæããããã«å¿
èŠãªlet
ã¹ããŒãã¡ã³ãã«æ³šæããŠãã ããã ããã¯å¯èœã§ãã
let foo = bar;
ã³ãŒãã¯foo
ãšããå€æ°ãäœæãã bar
ã®å€ããã€ã³ããbar
ã Rustã§ã¯ãããã©ã«ãã§å€æ°ã¯äžå€ã§ãã ããããå¯å€ã«ããã«ã¯ã let
é£ã®å€æ°åã«mut
ãè¿œå ããŸãã
let foo = 5;
let mut guess
ã§å¯å€ã®guess
å€æ°ãäœælet mut guess
ããšãããããŸããã =
èšå·ã®å³åŽã¯ã guess
ãã€ã³ãããå€guess
ããã¯ãæ°ããæååãè¿ãé¢æ°ã§ããString::new
ãåŒã³åºããçµæã§ãã String
ã¯ãæé·ã§ããæåååïŒC ++ã®string
ããã³Javaã®StringBuilder
ãšåæ§ïŒã§ã UTF-8ãšã³ã³ãŒããããããã¹ããå«ã¿ãŸãã ::
in ::new
ã¯ã new
ãString
åã®é¢é£é¢æ°ã§ããããšã瀺ããŸãã é¢é£ä»ããããé¢æ°ã¯ãåããã®å Žåã¯Stringãããã³åã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«å®è£
ãããŸãã C ++ãªã©ã®äžéšã®èšèªã¯ããã®ãããªé¢æ°ã®éçã¡ãœãããåŒã³åºããŸãã new
é¢æ°ã¯ãæ°ãã空ã®String
ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã new
ãããã¿ã€ãã®æ°ããå€ãäœæããé¢æ°ã瀺ãããã«äœ¿çšããããããå€ãã®ã¿ã€ãã§å®è£
ãããŠããããšãããããŸãã ãŸãšãããšïŒ let mut guess = String::new();
æ°ãã空ã®String
ã€ã³ã¹ã¿ã³ã¹ïŒç©ºã®æååïŒã«ãã€ã³ããããæ°ããå¯å€å€æ°ãäœæããŸããã use std::io
ãuse std::io
ããŠIOãæäœuse std::io
é¢æ°ãå«ããŸããã 次ã«ãé¢é£ããé¢æ°stdin
åŒã³åºããŸãã
io::stdin().read_line(&mut guess) .expect("Failed to read line");
ããã°ã©ã ã®æåã«use std::io
ãèšè¿°ããªãã£ãå Žåã std::io::stdin
圢åŒã§ãã®é¢æ°ã®åŒã³åºããèšè¿°ã§ããŸãã stdin
é¢æ°ã¯ã æšæºå
¥åã® ãã³ãã«ãè¡šãåã§ããstd::io::Stdin
ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸã ã ããã¯ãŠãŒã¶ãŒã®ããŒããŒãã§ãã ã³ãŒãã®æ¬¡ã®éšåã§ãã.read_line(&mut guess)
ãåä¿¡ããã°ããã®ãã€ã³ã¿ãŒïŒ handle ïŒã§read_line
ãåŒã³åºããŠããŠãŒã¶ãŒå
¥åãèªã¿åãããã®stdin
ãåŒã³åºããŸãã ãŸããåäžã®åŒæ°&mut guess
ãéä¿¡ããŸãã read_line
ã¯ããŠãŒã¶ãŒããstdin
å
¥ã£ãŠãããã®ãåãåãããã®å
¥åãã¹ããªã³ã°ã«å
¥ããŸãããããã£ãŠãã¹ããªã³ã°å€æ°ãžã®ãªã³ã¯ãåãå
¥ããŸãã ã¡ãœããããŠãŒã¶ãŒå
¥åãè¿œå ããŠãã®æååã®å€ãå€æŽã§ããããã«ããã®æåååŒæ°ã¯å¯å€ã§ããå¿
èŠããããŸãã &
ã¯ãåŒæ°ïŒ &mut guess
ïŒãã³ãŒãã®ç°ãªãéšåãåãããŒã¿é åã«å€ããã®ããŒã¿é åããäœåºŠãã³ããŒããããšãªãã¢ã¯ã»ã¹ã§ããããã«ããåç
§ã§ããããšã瀺ããŸãã Rustã®åŒ·ã¿ã®1ã€ã¯ããªã³ã¯ã䜿ããããããšã§ãïŒã¡ã¢ãªãæå·ããããšã¯ãããŸããïŒã çŸæç¹ã§ã¯ãå€æ°ãªã©ã®ãªã³ã¯ãããã©ã«ãã§äžå€ã§ããããšãç¥ãã ãã§ååã§ãã ãããã£ãŠã &mut guess
&guess
ïŒäžå€ãªã³ã¯ãäœæïŒãèšè¿°ãã &mut guess
&guess
ïŒäžå€ãªã³ã¯ãäœæïŒãèšè¿°ããŸãã
.expect("Failed to read line");
.foo()
æ§æã䜿çšããŠã¡ãœãããåŒã³åºããšãã¯ãã³ãŒãè¡ãé·ããªããããªãããã«ãæ°ããè¡ã«ãžã£ã³ãããããšããå§ãããŸãã ããã«ãããä»ã®ããã°ã©ããŒãã³ãŒããèªã¿ããããªããŸãã
io::stdin().read_line(&mut guess).expect("Failed to read line");
å°ãé£ããèªã¿ãŸãã
ãšã©ãŒå®äºåŠçïŒ Result
䜿çšïŒ
read_line
èªã¿åãã ãã§ãªããå€ãè¿ããŸããããã§ã¯ãã¿ã€ãio::Result
å€ã§ãã Rustã«ã¯ãç°ãªãã©ã€ãã©ãªã¢ãžã¥ãŒã«ã«Result
ãšåŒã°ããããã€ãã®ã¿ã€ãããããŸãã
- äžè¬çãª
Result
- ç¹å®ã®äŸïŒ
io::Result
Result
åã¯åæã§ã - 代æ°çããŒã¿åã®å®è£
ã§ãã C / C ++ã§ã¯ãã¢ããã°ã«unionãšããã¿ã°ãä»ããããŸãã Result
å€ã¯ããªãã·ã§ã³Ok
ããã³Err
ã§è¡šãããšãã§ããŸãã Ok
ã¯ãæäœãæåããããšã瀺ããæ»ãå€ãå«ãŸããŸãã Err
æäœããšã©ãŒã§å®äºããããšã瀺ããå
éšã®ãšã©ãŒã«é¢ããæ
å ±ãå«ãŸããŠããŸãã Result
ãªã©ã®Result
åºæã®ã¡ãœããã¯ã Result
åã®å€ã«é©çšãããŸãã Result
åã®ãªããžã§ã¯ãã®å€ãErr
å Žåã expect
ã¯æž¡ããããšã©ãŒã¡ãã»ãŒãžã衚瀺ããããã°ã©ã ãã¯ã©ãã·ã¥ãããŸãã å€ãOk
å Žåã expect
ã¯Ok
å
ã®å€ãè¿ããŸãã read_line
ãŠããread_line
é¢æ°ã¯ïŒæåããå ŽåïŒ Ok
ããŠãŒã¶ãŒãå
¥åãããã€ãæ°ãè¿ããŸãã expect
åŒã³åºããªãå Žåãããã°ã©ã ã¯ã³ã³ãã€ã«æã«èŠåãçæããŸãã
$ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) warning: unused `std::result::Result` which must be used --> src/main.rs:10:5 | 10 | io::stdin().read_line(&mut guess); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note:
ã³ã³ãã€ã©ã¯ãè¿ãããResult
å€ã䜿çšããªãã£ãããšãéç¥ããããã°ã©ã ããšã©ãŒã®å¯èœæ§ãåŠçããªãã£ãããšã瀺ããŸãã èŠåãæå¶ããã«ã¯ããšã©ãŒåŠçã³ãŒããèšè¿°ããå¿
èŠããããŸãããããã°ã©ã ããšã©ãŒã§çµäºããæ¹æ³ã確èªããããã expect
ã䜿çšexpect
ãŸãã
printlnã䜿çšããå€ã®å°å·ïŒ
println!("You guessed: {}", guess);
{}
ã¯ããã¬ãŒã¹ãã«ããŒãã§ãããåä¿¡ããè¡ã«ãã®å¯å€ãã¬ãŒã¹ãã«ããŒã«å¯Ÿå¿ããå€ãããããšã瀺ããŸãã è€æ°ã®å€ãå°å·ããã«ã¯ãè€æ°ã®ãã¬ãŒã¹ãã«ããŒã䜿çšããŸããæåã®ãã¬ãŒã¹ãã«ããŒïŒ {}
ïŒã¯æåã®åºåå€ã«äžèŽãã2çªç®ãã2çªç®ã«åºåãããŸãã ããšãã°ã次ã®ããã«ïŒ
let x = 5; let y = 10; println!("x = {} and y = {}", x, y);
æåã®éšåã®æ€èšŒ
$ cargo run Compiling guessing_game v0.1.0 (file:
ããã°ã©ã ã¯çªå·ãèŠæ±ããç§ãã¡ãå
¥åããããã°ã©ã ã¯ãã®çªå·ãå°å·ããŸããã ã©ãã
ç§å¯çªå·ã®çæ
ãŠãŒã¶ãŒãæšæž¬ããããšããæ°åïŒ1ã100ïŒãèããŠãã ããã ããã¯ãã²ãŒã ãè€æ°åãã¬ã€ã§ããããã«ãä¹±æ°ã§ãªããã°ãªããŸããã Rustã«ã¯std
ïŒæšæºã©ã€ãã©ãªïŒã®ä¹±æ°ãæ±ãããã®ã¢ãžã¥ãŒã«ããªãããããµãŒãããŒãã£ã®ã©ã€ãã©ãªïŒRustã«é¢ããŠã¯crateïŒ rand
ãŸãã
è¿œå æ©èœã«ã¯ã©ãã¯ã䜿çšããŠããŸãã
ã¯ã¬ãŒãã¯ãRustã³ãŒãã®åãªãããã±ãŒãžã§ãã å®è¡å¯èœãã€ããªãã¡ã€ã«åœ¢åŒã®éåžžããã°ã©ã ã§ããå®è¡å¯èœã¯ã¬ãŒããäœæããŠããŸãã rand
-Cã®.oããã³.soãã¡ã€ã«ã«äŒŒãã©ã€ãã©ãªã¯ã¬ãŒã -ä»ã®ã¯ã¬ãŒãã«æ¥ç¶ã§ããé¢æ°ãå«ãŸããŠããŸãã 貚ç©ã¯ããµãŒãããŒãã£è£œã®ã©ãã¯ã®èšçœ®ã«éåžžã«äŸ¿å©ã§ãã rand
ã¯ã¬ãŒãã®äœ¿çšãéå§ããã«ã¯ã Cargo.tomlã«é©åãªå€æŽãå ããŠã rand
ãäŸåé¢ä¿ãšããŠå«ããå¿
èŠããããŸãã [äŸåé¢ä¿]ã»ã¯ã·ã§ã³ãå€æŽããŸã
[dependencies] rand = "0.3.14"
Cargo.tomlãã¡ã€ã«ã§ã¯ãã»ã¯ã·ã§ã³ããããŒã«ç¶ããã¹ãŠããæ°ããã»ã¯ã·ã§ã³ãå§ãŸããŸã§ç¶ããŸãã [dependencies]ã»ã¯ã·ã§ã³ã¯ã 貚ç©ã¬ãŒããæå®ããå Žæã§ããããããžã§ã¯ãã®ã³ãŒããäŸåããå Žæãããã³å¿
èŠãªããŒãžã§ã³ãæå®ããŸãã ãã®å Žåããããžã§ã¯ãããã«ãããã«ã¯ãããŒãžã§ã³0.3.14
æå®åãæã€rand
0.3.14
ãå¿
èŠã§ããããšã瀺ã0.3.14
ã Cargoã¯ãç°ãªãããŒãžã§ã³ã®ããã°ã©ã ã«ååãä»ããããã®æšæºã®1ã€ã§ããã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ã¢ãã«ãç解ããŠããŸãã 0.3.14
ãšããæ°å€ïŒå®éãããã¯^0.3.14
ç瞮圢ã§ãïŒã¯ãããŒãžã§ã³0.3.14ãšäºææ§ã®ãããªãŒãã³ïŒ ãããªã㯠ïŒAPIãåããããŒãžã§ã³ãé©ããŠããããšãæå³ããŸãã åéããŸãããããã ãæ°ããäŸåé¢ä¿ããããŸãïŒ
$ cargo build Updating registry `https://github.com/rust-lang/crates.io-index` Downloading rand v0.3.14 Downloading libc v0.2.14 Compiling libc v0.2.14 Compiling rand v0.3.14 Compiling guessing_game v0.1.0 (file:
Cargoã¯ãªããžããªïŒ ã¬ãžã¹ããª ïŒ -Crates.ioããäŸåé¢ä¿ãããŠã³ããŒãããŸãã Crates.ioã¯ãRustéçºè
ããªãŒãã³ãœãŒã¹ãããžã§ã¯ããæçš¿ããå Žæã§ãã Cargo.tomlã¯ãã€ã³ããã¯ã¹ãããŠã³ããŒãããåŸããŸã ããŠã³ããŒããããŠããªãäŸåé¢ä¿ããããã©ããã確èªããŸãã ããå Žåã¯ãããããããŠã³ããŒãããŸãã ããã«ã rand
ã¯åœŒã«äŸåããŠããããã圌ã¯ãŸã libc
ããŠã³ããŒãããŠããŸãã ããã¯ãæšç§»çãªäŸåé¢ä¿ãèªåçã«è§£æ±ºãããããšãæå³ããŸãã äŸåé¢ä¿ãããŠã³ããŒãããåŸãrustcïŒRustã³ã³ãã€ã©ãŒïŒã¯ããããã³ã³ãã€ã«ããããªã³ã³ãã€ã«ãããäŸåé¢ä¿ã䜿çšããŠããã°ã©ã èªäœãã³ã³ãã€ã«ããŸãã åã³cargo build
ãå®è¡cargo build
ãšãã¡ãã»ãŒãžã¯è¡šç€ºãããŸããã Cargoã¯ãå¿
èŠãªäŸåé¢ä¿ãæ¢ã«ããŠã³ããŒãããã³ã³ã³ãã€ã«ãããŠããããšãç¥ã£ãŠããã Cargo.tomlã® [dependencies]ã»ã¯ã·ã§ã³ãå€æŽããŠããªãããšãç¥ã£ãŠããŸãã Cargoã¯ãã³ãŒããå€æŽããŠããªãããšãç¥ã£ãŠãããããã³ãŒããåã³ã³ãã€ã«ããããšã¯ãããŸããã å®äºããå¿
èŠã®ããäœæ¥ããªãããã貚ç©ã¯çµäºããŸãã src / main.rsãéããŠå€æŽãããšã cargo build
ã¯ãããžã§ã¯ãã®ã³ãŒããå床ã³ã³ãã€ã«ããŸãããäŸåé¢ä¿ã¯å€æŽãããŠããªããããã³ã³ãã€ã«ããŸããïŒ ã€ã³ã¯ãªã¡ã³ã¿ã«ã³ã³ãã€ã« ïŒã
Cargo.lockã¯ã åçŸå¯èœãªãã«ãããã°ã©ã ã®ãã«ããæ¯æŽããŸã
Cargoã«ã¯ãæŽæ°å¯èœãªãã«ããååŸã§ããããŒã«ããããä»ã®ããŒãžã§ã³ã®äŸåé¢ä¿ãæå®ãããŸã§ãæå®ããäŸåé¢ä¿ã®ããŒãžã§ã³ã®ã¿ã䜿çšããŸãã éèŠãªãã°ä¿®æ£ãšã³ãŒããå£ããªã°ã¬ãã·ã§ã³ãå«ãrand
ã¯ã¬ãŒãããŒãžã§ã³v0.3.15
ããã©ããªããŸããïŒ ãã®åé¡ã解決ããããã«ã Cargo.lockãã¡ã€ã«ã䜿çšãããŸãããã®ãã¡ã€ã«ã¯ãåããŠcagoãã«ããèµ·åããããšãã«äœæãããçŸåšã¯ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ãããŸãã ãããžã§ã¯ããåããŠã¢ã»ã³ãã«ãããšããCargoã¯ãæå®ãããèŠä»¶ïŒ Cargo.tomlå
ïŒã«äžèŽããäŸåé¢ä¿çªå·ãèŠã€ãããããã«é¢ããæ
å ±ãCargo.lockã«æžã蟌ã¿ãŸãã 2åç®ä»¥éã«ãããžã§ã¯ããã¢ã»ã³ãã«ãããšãCargoã¯Cargo.lockããã§ã«ååšããããšã確èªããããã«ç€ºãããŠããããŒãžã§ã³ã䜿çšããããããå床衚瀺ãããäŸåé¢ä¿ã®åæã«æéãè²»ãããŸãã ããã«ãããåçŸå¯èœãªã¢ã»ã³ããªãååŸã§ããŸãã ã€ãŸããæ瀺çã«ã¢ããã°ã¬ãŒããããŸã§ããããžã§ã¯ãã¯rand
0.3.14
ããŒãžã§ã³0.3.14
ã䜿çšããŸãã
ã©ãã¯ãææ°ããŒãžã§ã³ã«æŽæ°ãã
ã¯ã¬ãŒããæŽæ°ããå ŽåãCargoã¯updateã³ãã³ããæäŸããŸãã
- Cargo.lockãç¡èŠãã Cargo.tomlã§æå®ããèŠä»¶ãæºããææ°ã®äŸåé¢ä¿ãèŠã€ããŸãã
- æåãããšãCargoã¯ãããã®æŽæ°ãããããŒãžã§ã³çªå·ãCargo.lockã«æžã蟌ã¿ãŸã
ããã©ã«ãã§ã¯ãCargoã¯ããŒãžã§ã³> 0.3.0
ããã³< 0.4.0
ã䜿çšããŸãã rand
ã®äœæè
ã2ã€ã®æ°ããããŒãžã§ã³ãããšãã°0.3.15
ãš0.4.0
0.3.15
ãšãäŸåé¢ä¿ãæŽæ°ãããšãã«æ¬¡ã®ããã«è¡šç€ºãããŸãïŒ cargo update
ïŒã
$ cargo update Updating registry `https://github.com/rust-lang/crates.io-index` Updating rand v0.3.14 -> v0.3.15
ãã®åŸã Cargo.lockã®rand
ã®ããŒãžã§ã³ã0.3.15ã«å€æŽãããããšã«0.3.15
ã rand
ããŒãžã§ã³0.4.0
ãŸãã¯ä»ã®ããŒãžã§ã³0.4.x
ã䜿çšããå Žåã¯ã Cargo.tomlã次ã®ããã«æŽæ°ããå¿
èŠããããŸãã
[dependencies] rand = "0.4.0"
次åã cargo build
ãå®è¡ãããšãCargoã¯äœ¿çšå¯èœãªã¯ã¬ãŒãã®ã€ã³ããã¯ã¹ãæŽæ°ããäŸåé¢ä¿ãå確èªããŸãã Cargoã䜿çšãããšããµãŒãããŒãã£ã®ã©ã€ãã©ãªãç°¡åã«æ¥ç¶ã§ãã ã³ãŒãã®åå©çšã«åœ¹ç«ã¡ãŸãã ãããã
æ¢åã®ãã®ããã«ãã£ã³ã°ãããã¯ãšããŠäœ¿çšããŠãæ°ããã¯ã¬ãŒããäœæããŸãã
ä¹±æ°çæ
rand
䜿çšã«ç§»ããŸãããããã®ããã src / main.rsãæŽæ°ããŸã
extern crate rand; use std::io; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); println!("You guessed: {}", guess); }
extern crate rand;
ãè¿œå ããŸããextern crate rand;
ããµãŒãããŒãã£ã®ã©ã€ãã©ãªãæ¥ç¶ããå¿
èŠãããããšãrustcã«ç€ºããŸãã rand::
èšè¿°ããããšã§rand::
ããé¢æ°ãåŒã³åºãæ©äŒãããããã use rand
ãuse rand
ããšã«ã䌌ãŠãuse rand
ã use rand::Rng
ãè¿œå ããŸããã Rng
ã¯ãä¹±æ°ãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠå®è£
ãããã¡ãœãããå®çŸ©ããç¹æ§ã§ãã ã¡ãœããã䜿çšã§ããããã«ããã®ç¹æ§ã¯ã¹ã³ãŒãå
ã«ãªããã°ãªããŸããã ãŸããäžå€®ã«2è¡è¿œå ããŸããã rand::thread_rng
é¢æ°rand::thread_rng
ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠäºåã«åæåïŒ ã·ãŒã ïŒãããŠãããçŸåšã®ã¹ã¬ããã«å¯ŸããŠããŒã«ã«ãªä¹±æ°ãžã§ãã¬ãŒã¿ãŒãè¿ããŸãã 次ã«ããžã§ãã¬ãŒã¿ãŒã§gen_range
ãåŒã³åºããŸãã ãã®ã¡ãœããã¯ã以åã«use rand::Rng
æŒç®åãuse rand::Rng
ããŠã¹ã³ãŒãã«å°å
¥ããRng
ã§å®çŸ©ãããŠããŸãã gen_range
ã¯2ã€ã®æ°å€ãåãããããã®éã«ããä¹±æ°ãè¿ããŸãã ç¯å²ã«ã¯äžéãå«ãŸããäžéã¯å«ãŸããŸããããã®ããã1ã100ã®æ°åãååŸããã«ã¯ãæ°å1
ãš101
æå®ããå¿
èŠããããŸããã¯ã¬ãŒãã®ãã¹ãŠã®æ©èœãç解ããã«ã¯ããã®ããã¥ã¡ã³ããèªãå¿
èŠããããŸãã Cargoã®ãã1ã€ã®å¯èœæ§ã¯ã cargo doc --open
åŒã³åºããŠããã¥ã¡ã³ãããåéãã§ããããšã§ãããã®åŸããã©ãŠã¶ã§ããã¥ã¡ã³ããéããŸãïŒã¢ã»ã³ããªåŸïŒã ä»ã®rand
ãµãæ©èœã«èå³ãããå Žåã¯ãå·Šãã€ã³ã§rand
ã¢ã€ãã ãéžæããŸãã è¿œå ãã2è¡ç®ã¯ãç§å¯ã®çªå·ãåºåããŸãã ä»ã®ãšããããã®ãŸãŸã«ããŠãããŸããããããã°ã©ã ã®åäœã確èªããã®ã«äŸ¿å©ã§ããããã°ã©ã ã®æçµããŒãžã§ã³ã«ã¯ãããŸããã æ°åå®è¡ããŸãã
$ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs Running `target/debug/guessing_game` Guess the number! The secret number is: 7 Please input your guess. 4 You guessed: 4 $ cargo run Running `target/debug/guessing_game` Guess the number! The secret number is: 83 Please input your guess. 5 You guessed: 5
ããã°ã©ã ã¯æ¯å1ãã100ãŸã§ã®ç°ãªãä¹±æ°ãåºåããå¿
èŠããããŸãã
æšæž¬ãæ蚌çªå·ãšæ¯èŒãã
ä¹±æ°ãçæãããŠãŒã¶ãŒããæšæž¬ãåŸãåŸãããããæ¯èŒã§ããŸãã src / main.rsãå€æŽããŸã
extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), } }
ããã§æåã®ãªãã¿ã®ãªãèŠçŽ ã¯ãuseã¹ããŒãã¡ã³ãã®å¥ã®äœ¿çšæ³ã§ããããã¯ã std::cmp::Ordering
ãstdãã scopeã«å€æããŸãã Ordering
ã¯å¥ã®åæã§ããã Result
ã«äŒŒãŠããŸãããä»ã®ãªãã·ã§ã³ããããŸãã
Less
Greater
Equal
ãããã¯ã2ã€ã®æ°å€ãæ¯èŒãããšåŸããã3ã€ã®çµæã§ãã ãŸãã Ordering
ã¿ã€ãã䜿çšããŠã³ãŒããè¿œå ããŸããã
match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), }
cmp
ã¡ãœããã¯2ã€ã®æ°å€ãæ¯èŒããæ¯èŒå¯èœãª2ã€ã®ãšã³ãã£ãã£ã«é¢é£ããŠåŒã³åºãããšãã§ããŸãã ãã®èŠçŽ ãšæ¯èŒããããã®ãžã®ãªã³ã¯ãååŸããŸãããã®å Žåã guess
ãšsecret_number
ãŸãã cmp
ã¯Ordering
ãªãã·ã§ã³ãè¿ããŸãïŒ use
ã¹ããŒãã¡ã³ãã䜿çšããŠä»¥åã«ã¹ã³ãŒãã«æã£ãŠããŸããïŒã ãŸãã match
äžèŽã䜿çšããŠãæ¯èŒã®çµæã«å¿ããŠã次ã«äœããããã決å®ããŸãã ãããmatch
ã¯ãã©ã³ãïŒ arm
ïŒã§æ§æãããŸãã ãã©ã³ãã¯ãäžèŽããåŒããã©ã³ãã®ãã¿ãŒã³ãšäžèŽããå Žåã«å®è¡ããå¿
èŠããããã¿ãŒã³ãšã³ãŒãã§æ§æãããŸãã Rustã¯ã match
ãã©ã³ãå
ã®ãã¿ãŒã³ã䜿çšããŠåŒãé çªã«äžèŽããã match
ãèŠã€ãã£ãåŸã match
ãããã¿ãŒã³ã®å³åŽã®ã³ãŒããå®è¡ãããŸãã ããã°ã©ã ãšã®å¯èœãªçžäºäœçšã®äŸãèŠãŠã¿ãŸãããã ãŠãŒã¶ãŒãæšæž¬ãšããŠæ°å€50ãææ¡ããç§å¯ïŒæ³å®ïŒæ°å€ã38ã§ãããšããŸããããã³ãŒãã50ãš38ãæ¯èŒãããšã cmp
ã¡ãœããã¯50> 38ã§ããããOrdering::Greater
è¿ããŸãã ã match
ã¯æåã®ãã©ã³ãOrdering::Less
ã®ãã³ãã¬ãŒãã調ã¹ãŸããã Ordering::Greater
å€ã¯Ordering::Less
ãšæ¯èŒã§ããªãããïŒãã®å Žåã¯çãããªãããïŒããã®ãã©ã³ãã®ã³ãŒããç¡èŠãã次ã®ãã³ãã¬ãŒããšã®æ¯èŒãç¶è¡ããŸãã 次ã®ãã©ã³ãã®ãã³ãã¬ãŒãã§ããOrdering::Greater
ã Ordering::Greater
ïŒ match
ãæž¡ãmatch
ïŒ Ordering::Greater
åçã§ãã Too big!
ã match
, . , :
$ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) error[E0308]: mismatched types --> src/main.rs:23:21 | 23 | match guess.cmp(&secret_number) { | ^^^^^^^^^^^^^^ expected struct `std::string::String`, found integral variable | = note: expected type `&std::string::String` = note: found type `&{integer}` error: aborting due to previous error Could not compile `guessing_game`.
, . Rust â , , , . let guess = String::new()
, Rust , guess
String
, . , secret_number
â . 1 100. :
i32
â 32- ( )u32
â 32- ( )i64
â 64- ( )
ãã®ä»ã Rust i32
, secret_number
( , , , secret_number
, ). , Rust . String
, , , . main
:
extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = guess.trim().parse() .expect("Please type a number!"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), } }
:
let guess: u32 = guess.trim().parse() .expect("Please type a number!");
guess
. , ? , Rust ( shadow ), . , . ( shadowing ) ( identifier ), , guess_str
guess
. ( bind
) guess
guess.trim().parse()
. guess
guess
, . trim
String
. u32
, ENTER
, ( read_line
). ENTER
, . , 5 ENTER
, guess
5\n
. \n
â , ENTER
. trim
\n
, 5
. parse
String
, . , Rust , let guess: u32
. ( :
) guess
, Rust , ( annotate ) . Rust , , u32
, 32- . . u32
guess
guess
secret_number
, Rust secret_number
u32
. ( u32
). parse
. , , A%
, . - , , parse
Result
, , read_line
. Result
: expect
. parse
Err
- , , expect
, expect
. parse
, parse
Ok
, expect
Ok
. :
$ cargo run Compiling guessing_game v0.1.0 (file:
ãããïŒ , , 76. , - :
loop
. :
extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); loop { println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = guess.trim().parse() .expect("Please type a number!"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), } } }
, . :
$ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Running `target/guessing_game` Guess the number! The secret number is: 59 Please input your guess. 45 You guessed: 45 Too small! Please input your guess. 60 You guessed: 60 Too big! Please input your guess. 59 You guessed: 59 You win! Please input your guess. quit thread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit }', src/libcore/result.rs:785 note: Run with `RUST_BACKTRACE=1` for a backtrace. error: Process didn't exit successfully: `target/debug/guess` (exit code: 101)
quit
, , - . : , , .
, break
:
extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); loop { println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = guess.trim().parse() .expect("Please type a number!"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => { println!("You win!"); break; } } } }
break
You win!
, , , . , .
, , . , :
let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, };
expect
match
. , . parse
, Ok
match
, , Ok
( num
), parse
Ok
. guess
. parse
, Err
, . Err
Ok(num)
match
, Err(_)
. _
, , Err(_)
Err
. match
â continue
, . :
$ cargo run Compiling guessing_game v0.1.0 (file:
çŽ æŽãããã .
extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); loop { println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => { println!("You win!"); break; } } } }
ãããã«
Rust:
let
â ( type inference
)
match
â- .
static
++ - ( crates )