7.0 ํจํค์ง, ํฌ๋์ดํธ, ๋ชจ๋์ ์ด์ฉํด ์ปค์ง๋ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ
-
ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด์ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํด์ง๋ค, ๊ธฐ๋ฅ์ ๋จ์๋ก ๋ชจ๋ํํ๊ณ ๋๋ ์ผ ๊ด๋ฆฌํ๋๊ฒ์ด ํธ๋ฆฌํ๋ค.
-
์ด ์ฑํฐ๋ ๊ทธ๋ฌํ ๊ฒ๋ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฌ๋ค.
-
๋์ ๋ ๋ฒจ์์์ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ์ํด encaptulating, implementing๋ฑ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฌ๋ค.
-
์ค์ ๊ตฌํ์ ์์ง ๋ชปํด๋ ์ฌ์ฉํ ์ ์๋ ์ธํฐํ์ด์ค๋ก ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฌ๋ค.
-
scope์ namespace๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฌ๋ค.
-
์์ ๋ด์ฉ๋ค์ ์์ฐ๋ฅด๋ ๋ฌ์คํธ์ ๋ชจ๋ํ ์์คํ ์ ์๋์ ๊ฐ๋ค.
package
: ํฌ๋ ์ดํธ๋ฅผ ๋น๋ํ๊ณ ๊ณต์ ํ๋ ๋จ์crate
: ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํํ์ผ์ ๋น๋ํ๋ ๋จ์module
: ์ฝ๋๋ฅผ ๊ทธ๋ฃนํํ๊ณ namespace๋ฅผ ์ ๊ณตํ๋ ๋จ์path
: ๋ชจ๋์ ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ
7.1 Package and Crates
-
crate
๋ ๋ฌ์คํธ์ ์ปดํ์ผ๋ฌ๊ฐ ํ๋ฒ์ ๊ณ ๋ ค ํ ์ ์๋ ๊ฐ์ฅ ์ต์์ ์ฝ๋ ๋จ์์ด๋ค. -
cargo
๊ฐ ์๋rustc
๋ก ์ปดํ์ผ์ ํ๋ ๊ฒฝ์ฐ์, ํ๋์ ์์ค์ฝ๋ํ์ผ๋ง ์ปดํ์ผ ํ๋๋ผ๋, ์ปดํ์ผ๋ฌ๋ ๊ทธ ํ๋์ ํ์ผ์ ํ๋์ ํฌ๋ ์ดํธ๋ก ์ทจ๊ธํ๋ค. -
crate
๋ ๋ชจ๋์ ํฌํจ ํ ์ ์๋๋ฐ, ํด๋น ๋ชจ๋์crate
๋ก ์ปดํ์ผ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ ์ ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์๋ค. -
crate
๋ ๋๊ฐ์ง ํํ๋ก ๋๋๋ค.binary crate
: ์คํํ์ผ์ ๋ง๋๋ ํฌ๋ ์ดํธ, cli ํ๋ก๊ทธ๋จ์ด๋ ์๋ฒ ํ๋ก๊ทธ๋จ์ฒ๋ผ, ๋ํmain
ํจ์๋ฅผ ๊ผญ ใ ํฌํจํด์ผํ๋ค.library crate
: ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ํฌ๋ ์ดํธ,main
ํจ์๋ฅผ ํฌํจํ์ง ์์ผ๋ฉฐ, ์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
-
crate root
๋ ์ปดํ์ผ๋ฌ๊ฐ ํฌ๋ ์ดํธ๋ฅผ ์์ํ๋ ํ์ผ์ ๊ฐ๋ฆฌํจ๋ค. ์ด ํ์ผ์crate
์ ๋ฃจํธ ๋ชจ๋์ ์ ์ํ๋ค. -
package
๋ ํ๋ ์ด์์ ํฌ๋ ์ดํธ๋ค์ ํฌํจํ๋(bundle) ๋จ์์ด๋ค. -
package
๋Cargo.toml
ํ์ผ์ ๊ฐ์ง๋ฉฐ, ์ด ํ์ผ์package
์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํด์ package ๋ด๋ถ์ ํด๋น ํฌ๋ ์ดํธ๋ค์ ์ด๋ป๊ฒ ๋น๋ ํด์ผ ํ๋์ง ์๋ ค์ค๋ค. -
package
๋ ํ๋์ ํฌ๋ ์ดํธ๋ง ํฌํจ ํ ์๋ ์๊ณ , ์ฌ๋ฌ๊ฐ์ ํฌ๋ ์ดํธ๋ฅผ ํฌํจ ํ ์๋ ์๋ค. -
๋ค์์
binary crate
๋ฅผ ๊ฐ์ง ์ ์์ผ๋, ํ๋์library crate
๋ง ๊ฐ์ง ์ ์๋ค. -
src/main.rs
์src/lib.rs
๋ ๊ฐ๊ฐbinary crate
์library crate
์crate root
์ด๋ค.
7.2 Defining Modules to Control Scope and Privacy
์ด ์ฑํฐ์์๋ ๋ชจ๋๊ณผ ๋ชจ๋ ์์คํ ์ ๋ํด ๋ค๋ฃฌ๋ค. ์ฃผ์ ํค์๋๋ค์ ๋ค์๊ณผ ๊ฐ๋ค
module
: ์ฝ๋๋ฅผ ๊ทธ๋ฃนํํ๊ณ namespace๋ฅผ ์ ๊ณตํ๋ ๋จ์use
: ๋ชจ๋์ ๋ค๋ฅธ ์ค์ฝํ๋ก ๊ฐ์ ธ์ค๋ ํค์๋as
: ๊ฐ์ ธ์จ ๋ชจ๋์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ํค์๋pub
: ๋ชจ๋์ ๊ณต๊ฐํ๋ ํค์๋
7.2.1 Modules Cheetsheet
๋ฌ์คํธ์ ๋ชจ๋ ์์คํ ์ด ๋ฐ๋ฅด๋ ๊ท์น๊ณผ ๋์ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
-
Start from the crate root
: ํฌ๋ ์ดํธ๋ฅผ ์ปดํ์ผ ํ ๋, ์ปดํ์ผ๋ฌ๋ ์ปดํ์ผ ํ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ํดcrate root
๋ฅผ ์ฐพ๋๋ค. (src/main.rs
์src/lib.rs
). -
Declaring modules
: crate root์์ ์๋ก์ด ๋ชจ๋๋ค์ ์ ์ธ ํ ์ ์๋ฐ. ๋ชจ๋์mod
ํค์๋์ ์ ์ธํ๋ค. ์๋ฅผ๋ค์ดmod garden;
๊ณผ ๊ฐ์ด ์ ์ธํ๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ชจ๋์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ ์์น์์ ์ฐพ๋๋ค -
Defining modules in other files
: ๋ชจ๋์ ๋ค๋ฅธ ํ์ผ์ ์ ์ ํ ์ ์๋ค. ์ด๋ ํ์ผ์ ์ด๋ฆ์ ๋ชจ๋์ ์ด๋ฆ๊ณผ ๊ฐ์์ผ ํ๋ค. ์๋ฅผ๋ค์ดmod garden;
์ด๋ผ๊ณ ์ ์ธํ๋ฉด,garden.rs
๋garden/mod.rs
ํ์ผ์ ์ฐพ๋๋ค.- Inline :
mod garden { ... }
์ ๊ฐ์ด ์ค๊ดํธ์ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ์ ์๋ ๋ชจ๋์ด ์๋์ง ์ธ๋ผ์ธ์์ ์ฐพ๋๋ค. - File :
src/garden.rs
๋src/garden/mod.rs
ํ์ผ์ ์ฐพ๋๋ค.
- Inline :
-
Declaring subomodules
: ๋ชจ๋ ๋ด๋ถ์ ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ ์ธ ํ ์ ์๋ค(crate root์๋ ์๋๋ค). ์ด๋๋mod
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฒ์๋mod vegetables;
๋ฅผmod garden;
์์ ์ ์ธํ๋ฉด ์๋์ ๊ฐ์ ์์๋ก ์ฐพ๋๋ค. -
Inline :
mod vegetables { ... }
์ ๊ฐ์ด ์ค๊ดํธ์ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ์ ์๋ ๋ชจ๋์ด ์๋์ง ์ธ๋ผ์ธ์์ ์ฐพ๋๋ค. -
File :
src/garden/vegetables.rs
๋src/garden/vegetables/mod.rs
ํ์ผ์ ์ฐพ๋๋ค. -
Paths to code in modules
: ๋ชจ๋์ด ํฌ๋ ์ดํธ์ ์ผ๋ถ๊ฐ ๋๋ค๋ฉด, ํด๋น ๋ชจ๋์ ์ฝ๋๋ฅผ ํฌ๋ ์ดํธ์ ์ด๋์์๋ ์ฐธ์กฐํ ์ ์๋ค. ๋ง์ฝ pricacy ๊ท์น์ ์ด๊ธ๋์ง ์๋๋ค๋ฉดAsparagus
๋ชจ๋์type
์ ํธ์ถํ๋ ค๋ฉดcrate::garden::vegetables::Asparagus
์ ๊ฐ์ด ํธ์ถ ํ ์ ์๋ค. -
Private vs public
: ๋ชจ๋ ๋ด๋ถ์ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก private์ด๋ค.pub
ํค์๋๋ฅผ ์ฌ์ฉํด ๋ชจ๋์ ๊ณต๊ฐ ํ ์ ์๋ค. ๋ชจ๋์ ๊ณต๊ฐํ๋ฉด, ๋ค๋ฅธ ํฌ๋ ์ดํธ์์ ํด๋น ๋ชจ๋์ ์ฌ์ฉ ํ ์ ์๋ค. -
Use
:use
ํค์๋๋ฅผ ์ฌ์ฉํด ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์๋ค.use
ํค์๋๋ ๋ชจ๋์ ํ์ฌ ์ค์ฝํ๋ก ๊ฐ์ ธ์จ๋ค.
// binary crate name backyard
backyard
โโโ Cargo.lock
โโโ Cargo.toml
โโโ src
โโโ garden
โย ย โโโ vegetables.rs
โโโ garden.rs
โโโ main.rs
File : src/main.rs
use crate::garden::vegetables::Asparagus;
pub mod garden;
fn main() {
let plant = Asparagus {};
println!("I'm growing {:?}!", plant);
}
File : src/garden.rs
pub mod vegetables;
File : src/garden/vegetables.rs
pub struct Asparagus {
pub name: String,
}
7.2.2 Grouping Related Code in Modules
-
๋ชจ๋์ ํฌ๋ ์ดํธ ๋ด๋ถ์ ์ฝ๋๋ฅผ ์กฐ์งํํํด์ ์ฝ๊ธฐ ์ฝ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ค๋ค.
-
๋ํ private๊ณผ public์ผ๋ก ์ฝ๋์ ์ ๊ทผ์ฑ์ ์ ์ดํ ์ ์๋ค.
-
๊ธฐ๋ณธ์ ์ผ๋ก private์ผ๋ก ์บก์ํ ํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ์ฝ๋์์ ํด๋น ๊ตฌํ์ ์๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ค.
-
์ค์ ๋ก ์ฌ์ฉํ๊ฑฐ๋ ์์กดํด์ผ ํ ์ฝ๋๋ค๋ง public์ผ๋ก ๋ง๋ค๋ฉด ๋๋ค.
-
์๋๋ ๋ชจ๋์ ์ฌ์ฉํด ๋ ์คํ ๋์ ๋ง๋๋ ์์ ์ด๋ค.
Filename : 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() {}
}
}
-
์ด๋ฐ์์ผ๋ก ๋ชจ๋์ ์ฌ์ฉํ๊ณ , ๊ทธ๋ฃนํํด๋๋ฉด ์ ๊ด๋ จ๋์ด ์๋์ง๋ฅผ ์ ์ ์๊ณ , ๊ทธ๋ฌํ ์ฝ๋๋ค์ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
-
๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๋ชจ๋์ ์ฝ๋๋ฅผ ์ถ๊ฐ/์์ ํ ๋๋, ๊ทธ๋ฌ๊ธฐ ์ํ ๊ฐ์ด๋๋ผ์ธ์ ์ ๊ณตํด ์ค ์ ์๋ค.
module tree
crate
โโโ front_of_house
โโโ hosting
โ โโโ add_to_waitlist
โ โโโ seat_at_table
โโโ serving
โโโ take_order
โโโ serve_order
โโโ take_payment
-
์ฐธ๊ณ ๋ก
src/main.rs
๋src/lib.rs
๋ crate root์ธ ์ด์ ๋, ์ด ๋ ํ์ผ์ค ํ๋๊ฐ ํฌ๋ ์ดํธ์ ๋ชจ๋๊ตฌ์กฐ ๋ฃจํธ์ธ ๋ชจ๋crate
๋ฅผ ์ ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค. -
๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋์ ๋ง์น ํ์ผ์์คํ ์ฒ๋ผ ๋ชจ๋์ด ๊ตฌ์กฐํ ๋ ์ ์๋ค.
7.3 Paths for Referring to an Item in the Module Tree
-
์์ ์ด์ง ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ฌ์คํธ์์ ๋ชจ๋์ ์์ดํ ์ ์ฐพ๊ธฐ ์ํด์๋ ํ์ผ์์คํ ์ฒ๋ผ
path
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฐพ์๋๊ฐ๊ฒ ๋๋ค. -
path
๋ ๋๊ฐ์ง ํํ๊ฐ ์๋ค.absolute path
: ํฌ๋ ์ดํธ์ ๋ฃจํธ์์ ์์ํ๋ ๊ฒฝ๋ก, ๋ฃจํธ๋crate
๋mod
ํค์๋๋ก ์ ์ธ๋ ๋ชจ๋์ด๋ค.relative path
: ํ์ฌ ๋ชจ๋์์ ์์ํ๋ ๊ฒฝ๋ก,self
,super
, ํน์ ์์ดํ ์ ์ด๋ฆ์ผ๋ก ์์ํ๋ค.
-
๋ ๊ฒฝ๋ก ๋ชจ๋, ํ๋ ์ด์์ ์๋ณ์์
::
๋ก ๊ตฌ๋ถ๋๋ค. -
์๋๋
crate
์ ๋ฃจํธ ๋ชจ๋์์front_of_house
๋ชจ๋์hosting
๋ชจ๋์add_to_waitlist
ํจ์๋ฅผ ํธ์ถํ๋ ์์ ์ด๋ค.
mod front_of_house {
mod hosting {
fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// Absolute path
crate::front_of_house::hosting::add_to_waitlist();
// Relative path
front_of_house::hosting::add_to_waitlist();
}
-
์ฒซ ๋ฒ์งธ ํธ์ถ์
crate
์ ๋ฃจํธ ๋ชจ๋์์ ์์ํ๋absolute path
์ด๋ค. -
๋ ๋ฒ์งธ ํธ์ถ์ ํ์ฌ ๋ชจ๋์์ ์์ํ๋
relative path
์ด๋ค.
๊ฐ๋ฅํ๋ฉด ์๋๊ฒฝ๋ก ๋์ ์ ๋๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ๋ซ๋ค๊ณ ์ด์ผ๊ธฐํ๋ค. ๋น์ฐํ ์ผ์ฅ์ผ๋จ์ ์์ง๋ง, ์ฝ๋ ์์ ์ด๋ ๋ฆฌํฉํ ๋ง์ ํ ๋, ์์ ์ด ์ผ๋ง๋ ์ ์ด์ง์ง๊ฐ ๊ฐ์ฅ ์ฃผ์ํ ๊ธฐ์ค์ด๋ผ๊ณ ํ์ ๋, ์ฝ๋ ์ ์์ ํธ์ถ์ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์ด๋ํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง์ด ๋๋ฌธ์ด๋ผ๊ณ ์ด์ผ๊ธฐํ๋ค. ํธ์ถํ๋ ๋ถ๋ถ์ด ์ ์๋ ๋ถ๋ถ์ ๋ํ ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด, ์ ์๋ ๋ถ๋ถ์ด ๋ค๋ฅธ๊ณณ์ผ๋ก ์ฎ๊ฒจ์ก์ ๋, ํธ์ถํ๋ ๋ถ๋ถ์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ ์ํฉ์ด ๋ ์์ฃผ ๋ฐ์ํ๋ค.
-
๋ฌดํผ ์์ ์ฝ๋๋ ๋์ํ์ง ์๋๋ค. ์๋ํ๋ฉด
add_to_waitlist
ํจ์๋ private์ด๊ธฐ ๋๋ฌธ์ด๋ค. -
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋
pub
ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
7.4.1 Starting Relative Paths with super
-
super
ํค์๋๋ฅผ ์ฌ์ฉํด ์์ ๋ชจ๋๋ก ์ด๋ํ ์ ์๋ค. -
file system์์
..
๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค. -
๋ถ๋ชจ ๋ชจ๋๊ณผ ์์ ๋ชจ๋์ด ์ฐ๊ด๋์ด ์์ ๋, rearrange๋ฅผ ํ ๋ ์ ์ฉํ๋ค.
Filename : src/lib.rs
fn deliver_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
super::deliver_order();
}
fn cook_order() {}
}
- ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ด์ ๋, ๋ชจ๋์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ๋, ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ชจ๋์ ์์น๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
7.3.2 Making Structs and Enums Public
-
๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์์๋
pub
ํค์๋๋ฅผ ์ฌ์ฉํด ์ ๊ทผ์ฑ์ ์ ์ด ํ ์ ์์ง๋ง, ์ถ๊ฐ์ ์ผ๋ก ์์์ผ ํ ๊ฒ์ด ์๋ค. -
๊ตฌ์กฐ์ฒด๊ฐ public์ด๋ผ๊ณ ํด์ ๊ทธ ๊ตฌ์กฐ์ฒด์ ํ๋๊ฐ public์ด ๋๋ ๊ฒ์ ์๋๋ค.
-
๊ตฌ์กฐ์ฒด์ ํ๋๋ฅผ public์ผ๋ก ๋ง๋ค๋ ค๋ฉด, ๊ตฌ์กฐ์ฒด์ ํ๋๋ฅผ public์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
mod back_of_house {
pub struct Breakfast {
pub toast: String,
seasonal_fruit: String,
}
impl Breakfast {
pub fn summer(toast: &str) -> Breakfast {
Breakfast {
toast: String::from(toast),
seasonal_fruit: String::from("peaches"),
}
}
}
}
pub fn eat_at_restaurant() {
// Order a breakfast in the summer with Rye toast
let mut meal = back_of_house::Breakfast::summer("Rye");
// Change our mind about what bread we'd like
meal.toast = String::from("Wheat");
println!("I'd like {} toast please", meal.toast);
// The next line won't compile if we uncomment it; we're not allowed
// to see or modify the seasonal fruit that comes with the meal
// meal.seasonal_fruit = String::from("blueberries");
}
-
์์ ์ฝ๋๋ private์ผ๋ก ์ ์ธ๋
seasonal_fruit
ํ๋๊ฐ ์์ด ํด๋น ํ๋๋ฅผ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. -
์ฌ์ง์ด ํด๋น struct์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋, ํด๋น ํ๋๋ฅผ ์ด๊ธฐํ ํ ์ ์๊ธฐ ๋๋ฌธ์, summer์ ๊ฐ์ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
-
ํจํค์ง์ ํด๋์ค์ ์์๊ฐ ์๋์ ์ผ๋ก ๋ถ๋ถ๋ช ํ๋ ์๋ฐ์ ๋ฌ๋ฆฌ, ๋ฌ์คํธ๋ ํจํค์ง์ ํฌ๋ ์ดํธ์ ๊ฒฝ๊ณ๊ฐ ๋ช ํํ๊ณ , ์ด๋ ํ ์๋ฏธ์์๋ ์บก์ํ์ ๋ํ ๋ ๋ค์ํ ์ ์ด๋ฅผ ์ ๊ณตํ๋ค.
-
๋ฐ๋๋ก enum์ ๊ทธ ์์ฒด๋ก public์ด๋ฉด, ๊ทธ ์์ ์๋ ๋ชจ๋ variant๋ค๋ public์ด๋ค.
mod back_of_house {
pub enum Appetizer {
Soup,
Salad,
}
}
pub fn eat_at_restaurant() {
let order1 = back_of_house::Appetizer::Soup;
let order2 = back_of_house::Appetizer::Salad;
}
7.4 Bringing Paths into Scope with the use
Keyword
-
use
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ชจ๋์ ์์ดํ ์ ํ์ฌ ์ค์ฝํ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. -
use
ํค์๋๋::
๋ฅผ ์ฌ์ฉํด ์ ๊ทผํด์ผ ํ๋ ์์ดํ ์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
}
-
use
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด, symbolic link๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ๋ค. -
use
๋use
๋ฅผ ์ ์ธํ ์ค์ฝํ์์๋ง ์ ํจํ๋ค.
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
use crate::front_of_house::hosting;
hosting::add_to_waitlist();
}
fn seat_at_table() {
hosting::add_to_waitlist(); // ์ปดํ์ผ ์๋ฌ
}
7.4.2 Creating Idiomatic use Paths
use
ํค์๋๋ฅผ ์ฌ์ฉํด์ ํจ์๋ฅผ ํน์ ํด์ ๊ฐ์ ธ์ค๋๊ฒ์ด ์๋๋ผ ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์์ ํ ์ ์๋ค.
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
use crate::front_of_house::hosting::add_to_waitlist;
pub fn eat_at_restaurant() {
add_to_waitlist();
}
-
๋ฌผ๋ก ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
-
์ด๋ ๊ฒ ๋ถ๋ชจ ๋ชจ๋๊น์ง ๋ถ๋ฌ์ค๋ฉด, ์ค์ ๋ก ์ฌ์ฉ ํ ๋๋
hosting::add_to_waitlist
์ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๊ณ , ์ด๋ ๊ฒ ํ๋ฉด์ ์ด ํจ์๊ฐ ๋ก์ปฌ์ ์ ์๋์ด ์์ง ์๋ค๋ ๊ฒ์ ์๋ฆฌ๋ฉด์ ์ต์ํ์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉ ํ ์ ์๊ฒ ํด์ค๋ค. -
๋ฐ๋๋ก
use
ํค์๋๋ฅผ ์ฌ์ฉํด ํจ์๋ฅผ ๊ฐ์ ธ์ค๋ฉด ํด๋น ํจ์๊ฐ ์ด๋์ ์ ์๋์ด์๋์ง ํท๊ฐ๋ฆด ์ ์๋ค. -
๋ฐ๋๋ก
struct
๋enum
์ ๊ฐ์ ธ์ฌ ๋๋, ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ๋ช ์ํ๋๊ฒ์ด ๊ด์ฉ์ ์ด๋ค.
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert(1, 2);
}
-
๋ฑํ ์ด์ ๋ ์๊ณ , ๊ทธ๋ฅ ๊ด์ฉ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
-
๋ํ
use
ํค์๋๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ๊ฐ์ ์์ดํ ์ ๊ฐ์ ธ์ฌ ๋ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์์ดํ ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
use std::fmt;
use std::io;
fn function1() -> fmt::Result {
// --snip--
}
fn function2() -> io::Result<()> {
// --snip--
}
๋ง์ฝ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
use std::fmt::Result;
use std::io::Result;
fn function1() -> Result {
// --snip--
}
fn function2() -> Result<()> {
// --snip--
}
- ์ด๋ฐ ๊ฒฝ์ฐ์๋
as
ํค์๋๋ฅผ ์ฌ์ฉํด ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
use std::fmt::Result;
use std::io::Result as IoResult;
fn function1() -> Result {
// --snip--
}
fn function2() -> IoResult<()> {
// --snip--
}
7.4.3 Re-exporting Names with pub use
-
๊ธฐ๋ณธ์ ์ผ๋ก
use
ํค์๋๋ก ๊ฐ์ ธ์จ ์์ดํ ์ private์ด๋ค. -
๋ง์ฝ ๊ฐ์ ธ์จ ์์ดํ ์ public์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด,
pub use
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
}
-
์ด๋ ๊ฒ ํ๋ฉด
hosting
๋ชจ๋์ public์ด ๋๊ณ ,add_to_waitlist
ํจ์๋ public์ด ๋๋ค. -
restaurant::front_of_house::hosting::add_to_waitlist
์ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์. -
restaurant::hosting::add_to_waitlist
์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค. -
์ด๋ฌํ ๊ธฐ๋ฅ์, ์ฝ๋์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋ ธ์ถ๋์ง ์๋๋ก ํ ์ ์๋ค. (๋ ธ์ถ๋์ง ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๊ณ , ๋๋ฉ์ธ์ ๋ํ ์๊ฐ์ ํ์ง ์์ ์ ์๋ค.)
7.4.4 Using External Packages
-
์ธ๋ถ ํจํค์ง๋ฅผ ์ฌ์ฉํ ๋๋,
Cargo.toml
์ ์์กด์ฑ์ ์ถ๊ฐํ๊ณ ,use
ํค์๋๋ฅผ ์ฌ์ฉํด ๊ฐ์ ธ์ฌ ์ ์๋ค. -
use
ํค์๋๋ฅผ ์ฌ์ฉํด ๊ฐ์ ธ์ฌ ๋๋, ํจํค์ง์ ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํ๋ค.
[dependencies]
rand = "0.8.3"
use rand::Rng;
fn main() {
let secret_number = rand::thread_rng().gen_range(1..101);
println!("The secret number is: {}", secret_number);
}
-
์ด๋ ๊ฒ ํ๋ฉด
rand
ํจํค์ง์Rng
trait์ ๊ฐ์ ธ์ฌ ์ ์๋ค. -
Rng
trait์ ์ค์ฝํ์ ์๋thread_rng
ํจ์๋ฅผ ํธ์ถํ๊ณ ,gen_range
ํจ์๋ฅผ ํธ์ถ ํ ์ ์๋ค.
7.5 Separating Modules into Different Files
- ํ์ผ์์คํ ๊ณผ ์ด๋ฆ์ ์กฐ๊ธ ์๊ฐํด๋๋ฉด ๋ฑํ ์ด๋ ค์ด๊ฑด ์๊ธฐ์ ์๋ต~