ããã¯ããªã«ãããããŠæžãããã®ïŒ
åã«Rustã®Getting Startedã®ãCommand line apps in Rustãããã£ãã詊ããŠã¿ãŸããã
Getting started - Command Line Applications in Rust
RustのGetting Started「Command line apps in Rust」を試す - CLOVER🍀
ããã§ãã¡ã€ã«ãåå²ãå§ããæã«ãçšèªãå¥ã®ãœãŒã¹ã³ãŒãã«å®çŸ©ãã颿°ã®åŒã³åºãæ¹ãããããããªããïŒãšããæ°åã«ãªã£ãã®ã§ã
ãã®ãããã«é¢ããããã¥ã¡ã³ããèªãããšã«ããŸããã
ãã¡ãã§ãã
Managing Growing Projects with Packages, Crates, and Modules - The Rust Programming Language
ãªããã³ãŒãã䜿ãå Žåã¯ä»¥äžã®ç°å¢ã§è©ŠããŠããŸãã
$ rustup --version rustup 1.27.1 (54dd3d00f 2024-04-24) info: This is the version for the rustup toolchain manager, not the rustc compiler. info: The currently active `rustc` version is `rustc 1.83.0 (90b35a623 2024-11-26)`
Managing Growing Projects with Packages, Crates, and Modules
Rustã®ããã±ãŒãžãã¯ã¬ãŒããã¢ãžã¥ãŒã«ã«é¢ããããã¥ã¡ã³ãã¯ãã¡ãã§ããä»åã¯ãã®ããŒãžããã³ãã®é äžã®ããŒãžãèŠãŠãããŸãã
Managing Growing Projects with Packages, Crates, and Modules - The Rust Programming Language
æåã«æã£ãã®ã§ããããã®ããã¥ã¡ã³ãå ã«ã¯ããããžã§ã¯ãããšããèšèãã»ãšãã©åºãŠããŸããã
cargo newã§äœæããåäœã£ãŠãªããªãã§ããããïŒããã¥ã¡ã³ããèŠããšãCargoããã±ãŒãžãã¿ããã§ãã
This command will create a new Cargo package in the given directory.
Cargo Guideå ã®ããã¥ã¡ã³ããèŠãŠãããããã±ãŒãžãæ±ããªã®ã§ãããã¹ãèŠããšåã¯ããããžã§ã¯ãããšèªãã§ããã®ãããããŸããâŠã
Creating a New Package - The Cargo Book
ããã§ã¯ããããžã§ã¯ãããšããèšèã¯å¿ããããšã«ããŸããããã¥ã¡ã³ãå
ã«ããŸã«ããããžã§ã¯ãããšããèšèãããåäœãæããŠ
åºãŠããŸããããããã±ãŒãžãã«èªã¿æ¿ããããšã«ããŸãã
ãã®ããŒãžã§ã¯ãçšèªããŸãšããããŠããŸããã
- ããã±ãŒãž ⊠ã¯ã¬ãŒãããã«ãããã¹ããå ±æã§ããCargoã®æ©èœã®ããš
- ã¯ã¬ãŒã ⊠ã©ã€ãã©ãªãŒãŸãã¯å®è¡ãã¡ã€ã«ãçæããã¢ãžã¥ãŒã«ã®ããªãŒã®ããš
- ã¢ãžã¥ãŒã«ãš
use⊠ãã¹ã®æ§æãã¹ã³ãŒãããã©ã€ãã·ãŒãå¶åŸ¡ã§ããä»çµã¿ã®ããš - ã㹠⊠æ§é äœã颿°ãã¢ãžã¥ãŒã«ãªã©ã®é ç®ã«ååãã€ããæ¹æ³ã®ããš
Managing Growing Projects with Packages, Crates, and Modules - The Rust Programming Language
é äžã®ããŒãžããã©ã£ãŠãé ã«èŠãŠãããŸãããã
ããã±ãŒãžãšã¯ã¬ãŒã
ãŸãã¯ããã±ãŒãžãšã¯ã¬ãŒãããã
Packages and Crates - The Rust Programming Language
çšèªãšããŠã¯ããã§ããã
- ããã±ãŒãž ⊠ã¯ã¬ãŒãããã«ãããã¹ããå ±æã§ããCargoã®æ©èœã®ããš
- ã¯ã¬ãŒã ⊠ã©ã€ãã©ãªãŒãŸãã¯å®è¡ãã¡ã€ã«ãçæããã¢ãžã¥ãŒã«ã®ããªãŒã®ããš
ã¯ã¬ãŒãã¯ãRustã³ã³ãã€ã©ãŒã1床ã«èæ ®ããæå°éã®ã³ãŒãã ããã§ãã
A crate is the smallest amount of code that the Rust compiler considers at a time.
ã¯ã¬ãŒãã¯ã¢ãžã¥ãŒã«ãå«ã¿ãŸãã
Crates can contain modules,
ãŸããã¯ã¬ãŒãã«ã¯æ¬¡ã®2çš®é¡ããããŸãã
- ãã€ããªãŒã¯ã¬ãŒã
- ã³ãã³ãã©ã€ã³ããã°ã©ã ããµãŒããŒãªã©ãå®è¡å¯èœãªåœ¢åŒã«ã³ã³ãã€ã«ã§ãã
- å®è¡æã«åŒã³åºããã
main颿°ãå¿ èŠ
- ã©ã€ãã©ãªãŒã¯ã¬ãŒã
- è€æ°ã®ããã±ãŒãžã§å
±æããããšãç®çãšããæ©èœãå®çŸ©ãã
- ããRustããã°ã©ã ãäœæããŠããæã«ãã¯ã¬ãŒãããšããèšèã䜿ãæã¯ããããŠãã®å Žåã¯ã©ã€ãã©ãªãŒã¯ã¬ãŒããæããŠãã
main颿°ã¯ãªã
- è€æ°ã®ããã±ãŒãžã§å
±æããããšãç®çãšããæ©èœãå®çŸ©ãã
ããã±ãŒãžã¯ãããæ©èœã»ãããæäŸããã²ãšã€ä»¥äžã®ã¯ã¬ãŒãããŸãšãããã®ã§ãã
A package is a bundle of one or more crates that provides a set of functionality.
ããã±ãŒãžããèŠãã¯ã¬ãŒãã«é¢ãã話ã¯ä»¥äžã®ããã§ãã
- è€æ°ã®ãã€ããªãŒã¯ã¬ãŒããå«ãããšãã§ãã
- ã©ã€ãã©ãªãŒã¯ã¬ãŒãã¯æå€§ã²ãšã€ã®ã¿
- ãã€ããªãŒã¯ã¬ãŒããã©ã€ãã©ãªãŒã¯ã¬ãŒãã¯åããªãããå°ãªããšãã²ãšã€ã®ã¯ã¬ãŒããå«ãå¿ èŠããã
ãããŠãã¯ã¬ãŒãã«ãŒããšãããã®ãåºãŠããŸãããã€ããªãŒã¯ã¬ãŒããã©ã€ãã©ãªãŒã¯ã¬ãŒãã§ãããã以äžã®ååã®ããã§ãã
src/main.rs⊠ãã€ããªãŒã¯ã¬ãŒãã®ã¯ã¬ãŒãã«ãŒãsrc/lib.rs⊠ã©ã€ãã©ãªãŒã¯ã¬ãŒãã®ã¯ã¬ãŒãã«ãŒã
ã©ã¡ãã«ãèšããŸãããsrc/main.rsã§ããã°ããã±ãŒãžãšåãååã®ãã€ããªãŒã¯ã¬ãŒãã®ã¯ã¬ãŒãã«ãŒãã§ãããsrc/lib.rsã§ããã°
ããã±ãŒãžãšåãååã®ã©ã€ãã©ãªãŒã¯ã¬ãŒãã®ã¯ã¬ãŒãã«ãŒãã§ãããšããèŠåã«åŸããŸãã
rustcã§ã³ã³ãã€ã«ããæã«ã¯ãã¯ã¬ãŒãã«ãŒããåºç¹ã«ãªãããã§ãã
ãŸãããã±ãŒãžã«ã¯è€æ°ã®ã¯ã¬ãŒããå«ãããããšããããšã§ãããã以äžã®ããã«ãªãã¿ããã§ãã
- ããã±ãŒãžã«
src/main.rsãšsrc/lib.rsã®äž¡æ¹ãå«ãŸããŠããå Žåããã€ããªãŒã¯ã¬ãŒããšã©ã€ãã©ãªãŒã¯ã¬ãŒãã®2ã€ã®ã¯ã¬ãŒããå«ãŸããã©ã¡ããããã±ãŒãžåãšåãååã®ã¯ã¬ãŒããšãªã - è€æ°ã®ãã€ããªãŒã¯ã¬ãŒããæã€å Žåã¯ã
src/biné äžã«é 眮ããããšã§è€æ°ã®ãã€ããªãŒã¯ã¬ãŒããå«ããããšãã§ãã- åãã¡ã€ã«ã¯åå¥ã®ãã€ããªãŒã¯ã¬ãŒããšãªã
ã¢ãžã¥ãŒã«ã®å®çŸ©ãšã¹ã³ãŒãããã©ã€ãã·ãŒã®å¶åŸ¡
次ã¯ã¢ãžã¥ãŒã«ã®å®çŸ©ãšã¹ã³ãŒãããã©ã€ãã·ãŒã®å¶åŸ¡ã«ã€ããŠã§ãã
Defining Modules to Control Scope and Privacy - The Rust Programming Language
æåã«ããŒãã·ãŒããããã®ã§ç°¡åã«ãŸãšããŸãã
- ã³ã³ãã€ã«ã®åºç¹
- ã¯ã¬ãŒãã«ãŒãïŒ
src/main.rsããã³src/lib.rsïŒããå§ãŸã
- ã¯ã¬ãŒãã«ãŒãïŒ
- ã¢ãžã¥ãŒã«ã®å®£èš
- ã¯ã¬ãŒãã«ãŒãã§æ°ããã¢ãžã¥ãŒã«ã宣èšã§ãã
- æ§æã¯
mod [ã¢ãžã¥ãŒã«å];
- æ§æã¯
- ã¢ãžã¥ãŒã«ã宣èšãããšãã³ã³ãã€ã©ã¯æ¬¡ã®å Žæã§ã¢ãžã¥ãŒã«ã®ã³ãŒããæ¢ã
src/[ã¢ãžã¥ãŒã«å].rssrc/[ã¢ãžã¥ãŒã«å]/mod.rsïŒå€ãã¹ã¿ã€ã«ïŒ
- ã¯ã¬ãŒãã«ãŒãã§æ°ããã¢ãžã¥ãŒã«ã宣èšã§ãã
- ãµãã¢ãžã¥ãŒã«ã®å®£èš
- ã¯ã¬ãŒãã«ãŒã以å€ã§å®£èšãããã¢ãžã¥ãŒã«ã®ããš
- æ§æã¯
mod [ãµãã¢ãžã¥ãŒã«å];ïŒã¢ãžã¥ãŒã«ã®å®£èšãšåãïŒ
- æ§æã¯
- ã³ã³ãã€ã©ã¯èŠªã¢ãžã¥ãŒã«ã®ãã£ã¬ã¯ããªå
ã§ãµãã¢ãžã¥ãŒã«ã®ã³ãŒããæ¢ã
src/[芪ã¢ãžã¥ãŒã«å]/[ãµãã¢ãžã¥ãŒã«å].rssrc/[芪ã¢ãžã¥ãŒã«å]/[ãµãã¢ãžã¥ãŒã«å]/mod.rsïŒå€ãã¹ã¿ã€ã«ïŒ
- ã¯ã¬ãŒãã«ãŒã以å€ã§å®£èšãããã¢ãžã¥ãŒã«ã®ããš
- ã¢ãžã¥ãŒã«å
ã®ã³ãŒããžã®ãã¹
- ã¢ãžã¥ãŒã«ãã¯ã¬ãŒãã®äžéšã«ãªã£ãŠããå Žåããã©ã€ãã·ãŒã§èš±å¯ãããŠããã°ãã®ã¢ãžã¥ãŒã«ãåç §å¯èœ
- privateãšpublic
- ã¢ãžã¥ãŒã«å ã®ã³ãŒãã¯ããã©ã«ãã§ã¯èŠªã¢ãžã¥ãŒã«ã«å¯ŸããŠprivateã«ãªã£ãŠãã
- publicãªã¢ãžã¥ãŒã«ã«ããã«ã¯
mod [ã¢ãžã¥ãŒã«å];ã®ä»£ããã«pub mod [ã¢ãžã¥ãŒã«å];ã§å®£èšãã - publicã¢ãžã¥ãŒã«å
ã®å®çŸ©ããããªãã¯ã«ããã«ã¯ããã®å®çŸ©ã®å
é ã«
publicãä»äžãã
- use
- ã¹ã³ãŒãå ã§ããã¹ã®é·ãç¹°ãè¿ã衚çŸãæžããããã®æ§æ
ã¢ãžã¥ãŒã«ã䜿ãããšã§ãã¯ã¬ãŒãå
ã®ã³ãŒããæŽçããããã©ã€ãã©ãªãŒã¯ã¬ãŒããšããŠå
¬éãããã®ã§ãã£ãŠãå®è£
ã®è©³çްã¯
å
¬éããªããšãã£ãäœ¿ãæ¹ãã§ããããã§ãã
ããã¥ã¡ã³ãã®ãµã³ãã«ãããããŠã¿ãŸãããã
backyard
âââ Cargo.lock
âââ Cargo.toml
âââ src
âââ garden
â âââ vegetables.rs
âââ garden.rs
âââ main.rs
Cargoããã±ãŒãžã®äœæã
$ cargo new backyard $ cd backyard
ãµã³ãã«ããå°ãå€åœ¢ããŠããããªæãã«ããŸããã
$ tree src src âââ garden â  âââ vegetables.rs âââ garden.rs âââ main.rs 2 directories, 3 files
ãœãŒã¹ã³ãŒãã¯ãããªæãã§ãã
src/main.rs
use backyard::garden::vegetables::Asparagus; // 以äžã§ãå¯ use crate::garden::vegetables::Asparagus; pub mod garden; fn main() { let plant = Asparagus {}; println!("I'm growing {plant:?}!"); }
src/garden.rs
pub mod vegetables;
src/garden/vegetables.rs
#[derive(Debug)] pub struct Asparagus {}
å®è¡ã
$ cargo run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/backyard`
I'm growing Asparagus!
ã«ãŒãã¢ãžã¥ãŒã«ã®ã¢ãžã¥ãŒã«åãCargoããã±ãŒãžåã®ããã§ãã
ã«ãŒãã¢ãžã¥ãŒã«åã¯crateãšããããŒã¯ãŒãã«çœ®ãæããããšãã§ããããã§ãã
use backyard::garden::vegetables::Asparagus; // 以äžã§ãå¯ use crate::garden::vegetables::Asparagus;
ããã¯ãªããŸããã
use crate::backyard::garden::vegetables::Asparagus;
ãŸããã¢ãžã¥ãŒã«ã¯å ¥ãåã®æ§æã§å®çŸ©ãã§ããããã§ãã
src/lib.rs
mod front_of_house { mod hosting { fn add_to_waitlist() {} fn seat_at_table() {} } mod serving { fn take_order() {} fn serve_order() {} fn take_payment() {} } }
ããã¯ã¢ãžã¥ãŒã«ããªãŒãšããŠã¯ãããªãããã§ãã
[ããã±ãŒãž]
âââ front_of_house
âââ hosting
â âââ add_to_waitlist
â âââ seat_at_table
âââ serving
âââ take_order
âââ serve_order
âââ take_payment
ã¢ãžã¥ãŒã«ããªãŒãåç §ãããã¹
ããã§ã¯ã¢ãžã¥ãŒã«ããªãŒãåç §ããããã®ãã¹ã«ã€ããŠæžãããŠããŸãã
Paths for Referring to an Item in the Module Tree - The Rust Programming Language
ãã¹ã«ã¯æ¬¡ã®2ã€ã®åœ¢åŒããããŸãã
- 絶察ãã¹
- ã¯ã¬ãŒãã«ãŒãããã®çµ¶å¯Ÿãã¹
- ãã¹ãã«ãŒãã¢ãžã¥ãŒã«ããå§ãŸãå Žåã¯ãã¡ã
- çžå¯Ÿãã¹
- çŸåšã®ã¢ãžã¥ãŒã«ããã®çžå¯Ÿãã¹
- çŸåšã®ã¢ãžã¥ãŒã«åãŸãã¯
selfãsuperã䜿ã
ã©ã¡ãã䜿çšãããã¯ããã±ãŒãžã®ã«ãŒã«ã§æ±ºãããšãããŠããŸãããäžè¬çã«ã¯çµ¶å¯Ÿãã¹ãæšå¥šããŠããããã§ãã
ãã€ããªãŒã¯ã¬ãŒããšã©ã€ãã©ãªãŒã¯ã¬ãŒãã®äž¡æ¹ãå«ãããã±ãŒãžã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠã
Best Practices for Packages with a Binary and a Library
ãã®å Žåãã¢ãžã¥ãŒã«ããªãŒã¯src/lib.rsã§å®çŸ©ãã¹ããªããã§ãã
The module tree should be defined in src/lib.rs.
ãã€ããªãŒã¯ã¬ãŒãã¯ãã©ã€ãã©ãªãŒã¯ã¬ãŒãã®ã¯ã©ã€ã¢ã³ããšããŠæ©èœããŸãã
useããŒã¯ãŒãã䜿ã£ããã¹ãšã¹ã³ãŒãã®åã蟌ã¿
useããŒã¯ãŒãã䜿ã£ããã¹ãšã¹ã³ãŒãã®åã蟌ã¿ã«ã€ããŠã
Bringing Paths Into Scope with the use Keyword - The Rust Programming Language
ä»ã®èšèªã«ãããimportãªã©ãšäŒŒããããªè©±ãªã®ã§ã倧åã¯å²æããŸãã
ã¡ãã£ãšå€ãã£ãæ©èœãšããŠã¯ãuseããã ãã§ã¯ãªãpub useãšããããšã§åã蟌ãã ãã¹ãåãšã¯ã¹ããŒãã§ããããã§ãã
pub use crate::front_of_house::hosting;
ã¢ãžã¥ãŒã«ãç°ãªããã¡ã€ã«ã«åå²ãã
æåŸã¯ãã¢ãžã¥ãŒã«ãç°ãªããã¡ã€ã«ã«åå²ãããšããããŒãã§ãã
Separating Modules into Different Files - The Rust Programming Language
ããã§ã¯ããããŸã§ã²ãšã€ã®ãã¡ã€ã«ã§ã¢ãžã¥ãŒã«å®çŸ©ãããŠãããã®ãåå²ãããšããå
容ã§ãã1çªæåã®äŸãããã§ã«åå²ãããŠãã
ãããªæ°ãããŸããâŠã
ãããèªãã§ãããšãã¢ãžã¥ãŒã«ã®å®£èšã¯ä»¥äžã§è¡ãã®ãè¯ãããã§ããã
src/lib.rssrc/[ã¢ãžã¥ãŒã«å].rs
å°ã倧ããªäŸã
ããå°ã倧ããªäŸã¯ãªãã®ããªïŒãšæã£ããšãããRust by ExampleãèŠãã®ãè¯ãããã§ããã
File hierarchy - Rust By Example
ãããªäŸã§ããã
$ tree . . âââ my â âââ inaccessible.rs â âââ nested.rs âââ my.rs âââ split.rs
ããèŠããšãã¡ã€ã«ãšã¢ãžã¥ãŒã«ã®åäœãããªãè¿ããããããªæãã®å©çšã«ãªãããã§ããã
[ã¢ãžã¥ãŒã«å].rsãå®çŸ©ãã- ãããã¯ã¯ã¬ãŒãã«ãŒã
- ã¢ãžã¥ãŒã«å
ã«ãµãã¢ãžã¥ãŒã«ãæã€å Žåã
[ã¢ãžã¥ãŒã«å].rsã«[ã¢ãžã¥ãŒã«å]é äžã«å«ãŸããã¢ãžã¥ãŒã«å®çŸ©ãåæãã
ããšãã°ãäžèšäŸã ãšmy.rsã®å
容ã¯ãããªã£ãŠããŸãã
// Similarly `mod inaccessible` and `mod nested` will locate the `nested.rs` // and `inaccessible.rs` files and insert them here under their respective // modules mod inaccessible; pub mod nested; pub fn function() { println!("called `my::function()`"); } fn private_function() { println!("called `my::private_function()`"); } pub fn indirect_access() { print!("called `my::indirect_access()`, that\n> "); private_function(); }
ã¡ãã£ãšæ°ã«ãªã£ãããšãšããŠãGetting Startedã®ãCommand line apps in Rustãã§src/main.rsã®å®çŸ©ãsrc/lib.rsã«ç§»ããsrc/main.rsãã
åç
§ããããšããæã«å¯Ÿè±¡ã®é¢æ°ãããã±ãŒãžåïŒã«ãŒãã®ã¯ã¬ãŒãåïŒãã€ããŠæå®ããå¿
èŠããããŸããã
ãã€ããªãŒã¯ã¬ãŒãã®ã¯ã¬ãŒãã«ãŒãããã©ã€ãã©ãªãŒã¯ã¬ãŒãã®ã¯ã¬ãŒãã«ãŒããåç
§ããæããå¥ã¯ã¬ãŒãæ±ããªã®ã§ã¯ã¬ãŒãåã
å¿
èŠã ãšããããšã§ããããïŒååãåãã§ç°ãªãã¢ãžã¥ãŒã«ïŒïŒã
ãããã«
Rustã®ããã±ãŒãžãã¯ã¬ãŒããã¢ãžã¥ãŒã«ã«é¢ããããã¥ã¡ã³ããèŠãŠã¿ãŸããã
ãã¡ã€ã«ãåå²ããæã®æ±ããããããããªãã£ãã®ã§ãããã§ã ãã¶çè§£ãé²ãã ãšæããŸãã