์ด๊ฒ์ RFC "๊ฒฝ๋ก ๋ฐ ๊ฐ์์ฑ์ ๋ช
ํํ๊ฒ ํ๊ณ ๊ฐ์ํ"(rust-lang/rfcs#2126)์ ๋ํ ํ์ ์ถ์ ๋ฌธ์ ์
๋๋ค.
๊ฐ์์ฑ ์์ ์๋ก crate
์ ๋ํ ์ง๋ฌธ์ ์ฒ๋ฆฌํฉ๋๋ค.
ํด๊ฒฐ๋์ง ์์ ์ง๋ฌธ:
struct Foo(crate ::bar)
๋ฅผ ์ด๋ป๊ฒ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๊น?๊ฐ์์ฑ ์์ ์๋ก crate
์ ๋ํ ์๊ฒฌ:
pub(extern)
๊ฐ์ธ์ ์ผ๋ก, ๋๋ ๊ฐ์์ฑ ์์ ์๋ก์ crate
์ ๋งค์ฐ ์ฐฌ์ฑํ๋ฉฐ ์ฌ๊ธฐ์ @stepancheg ์ ์๊ฒฌ์ ๊ณต์ ํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ ์๊ณ ๋ ์๊ฒฉํ ๊ฐ์์ฑ์ ์ฅ๋ คํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ฉฐ crate
๊ฐ ๋ฐ๋ก ๊ทธ ์ผ์ ํฉ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก pub(crate)
์ ์ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋๋ ๋งค์ฐ ๋ช
์์ ์
๋๋ค.
@johnthagen ์ด ์ ๊ณตํ ์์ ๋ ๋ณด๊ธฐ์ ์ ๋ง ๊ณ ํต์ค๋ฝ์ต๋๋ค( crate
์ฌ์ฉ):
use crate::menu::{Sound, Volume};
crate mod color;
...
/// A type for storing text and an associated color it should
/// be drawn as.
crate struct ColoredText {
crate color: types::Color,
crate text: &'static str,
}
crate mod color;
๋ ํนํ ํผ๋์ค๋ฌ์ ๋ณด์
๋๋ค. ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์๊ฐํด๋ด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์ ์ค ์ผ๋ถ๋ ๋งค์ฐ C- static
-esque- ์ง๊ด์ ์ผ๋ก ๊ด๋ จ๋์ด ์์ง๋ง ์ค์ ๋ก๋ ๋๋ผ์ธ ์ ๋๋ก ๋๋ ทํฉ๋๋ค.
@johnthagen ์ผ๋ก ์ธํ ์์ ๋ ๋์๊ฒ ์ ์ฝํ์ง ์์ต๋๋ค. ์ฌ์ค, ๊ทธ๊ฒ์ ์์ฐ์ค๋ฝ๊ฒ ์ฝํ๊ณ ๋๋ ๋์นญ์ ์์ฃผ ์ข์ํฉ๋๋ค. ์ด๋ป๊ฒ ๋ณด๋ฉด ์๋ฆ๋ต์ต๋๋ค.
๊ฐ๋ ์ฑ์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ:
crate struct ColoredText {
crate color: types::Color,
crate text: &'static str,
}
๋ฌธ์ ๊ฐ ๋๋ค; ๊ทธ๋ฐ ๋ค์ Rust์ ๊ตฌ๋ฌธ์ ์ดํดํ๋ IDE/์๋ํฐ๋ ๋ค๋ฅธ ์์์ผ๋ก ๋ค๋ฅธ ์์น์ ์๋ crate
ํ ํฐ์ ๊ฐ์กฐ ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ๋ ์ฐจ์ด์ ์ ์ ์ ๋ฆฌํด์ผํฉ๋๋ค.
๊ฐ์์ฑ ์์ ์๋ก crate
๋ ํ์คํ ์ด์ํฉ๋๋ค. ์ด๊ฒ์ ๋
น๊ณผ ๊ด๋ จ์ด ์๋ ๊ฒ์ ๋ํด ๋งค์ฐ ๋
น ๊ด๋ จ ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. Kotlin ๋ฐ C#์ ์ด๋ฅผ ์ํด internal
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก crate-visible
pub
๋ฅผ ์ฌ์ฌ์ฉํ๊ณ pub*
๋๋ pub!
์ ๊ฐ์ด ์ธ์์์ ๋ณผ ์ ์๋ ๋ ๋น๋ช
์ ์ง๋ฅด๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
์ด์ ์ ์ ๊ธฐ๋์์ง๋ง ๋ด๊ฐ ๋ณด๋ ๊ทผ๋ณธ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
crate
๋ ๋ช
์ฌ ์
๋๋ค. pub(crate)
๊ฐ ๊ธธ๊ณ ์ด์ํด ๋ณด์
๋๋ค. ๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ ๋ฌด์ธ๊ฐ ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ ์ ์ผ๋ก ์ง์งํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๊ณผ ๊ด๋ จ๋ ๊ณต๊ฐ ํ์ฉ์ฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ ์ ์ ๋ฌ๋์์ต๋๋ค.crate
๋ ์ด์ "this-crate" ๊ฐ์ ธ์ค๊ธฐ์ ์ต์ปค๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ, "์ด๊ฒ์ด ์ ์๋ ๊ณณ๋ง๋ค ์ด ์์์์ ๊ฐ์์ ์ผ๋ก ๋ด๋ณด๋ด์ง๋๋ค"์ ๋ค๋ฅธ ์๋ฏธ์
๋๋ค.// Here `crate` means the root of this crate.
use crate::menu::{Sound, Volume};
// Here, `crate` means: export crate::game::color
// The `crate` is referring to `color`, not the root.
crate mod color;
...
/// A type for storing text and an associated color it should
/// be drawn as.
// Same potential confusion as `crate mod color`
crate struct ColoredText {
crate color: types::Color,
crate text: &'static str,
}
Kotlin/C#์์ @matklad ์ internal
๋ฅผ ์ฌ์ฉํ๋ ์์ ๋น๊ตํฉ๋๋ค.
use crate::menu::{Sound, Volume};
internal mod color;
...
/// A type for storing text and an associated color it should
/// be drawn as.
internal struct ColoredText {
internal color: types::Color,
internal text: &'static str,
}
internal
๊ฐ ์ฌ๋ฐ๋ฅธ ํค์๋๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์๋์ง๋ง(Rust๋ ๋งค์ฐ ์งง์ ์ฝ์ด๋ฅผ ์ข์ํ๊ณ int
๋ ๋ถํํ๋ C/C++/Java ํผ๋์ผ๋ก ๊ฐ๋ ์ฐจ ์์), ๊ฐ์ธ์ ์ผ๋ก ๋ ๋ฒ์งธ ์๊ฐ ์ฆ์ ๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค.
๋๋ ๋ํ crate
๊ฐ์์ฑ ํค์๋๊ฐ ๋ค๋ฅธ ์ธ์ด์์ Rust๋ก ์ค๋ ์ฌ๋๋ค์๊ฒ ํผ๋์ ์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Rust์ ๊ด๋ จ๋ ๋ง์ ์ฌ๋๋ค์ด ์ด ์ค๋ ๋์ ๋ํด ๋
ผํ์ ํ ์ ๋๋ก ํผ๋์ค๋ฝ๋ค๋ฉด, Rust๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์๊ฒ๋ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์์ํด์ผ ํฉ๋๋ค.
pub(crate)
์ ์ฝ๊ฐ ๋ ๊ธด ๊ตฌ๋ฌธ์ ์์ ์ธ๋ถ์ ๋๋ฌํ ์ ์๋ pub
ํญ๋ชฉ์ด ์๋ค๋ ๊ฒฝ๊ณ /์ค๋ฅ๊ฐ ๋์ง ์๋๋ค๋ฉด ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ์๋ ์ ์์ต๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก pub(crate) struct Foo { ... }
๊ฐ ์๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ impl Foo
์ ์๋ ๋ชจ๋ pub fn
$ ์ ๋ถ๋ช
ํ ๋๋ฌํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ ๊ทธ๊ฒ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
pub struct Foo
์์ pub(crate) struct Foo
๋ก ์ ํ์ ํ์ํ๋ฉด ํ์ฌ Rust 2015์์ ๋ฐ์ ์์
์ผ๋ก ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ค๋ฅธ pub fn
s๋ ๋ฌธ์ ๊ฐ ์ค์ ๊ฐ ์๋ ๋ ๊ฐ์๊ธฐ pub(crate)
์ ํ์ ์ฌ์ฉํ์ฌ ์กด์ฌํฉ๋๋ค. ๋ค๋ฅธ ์ ํ๋ pub(crate)
์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๋๋ ๋ํ pub
๋ฅผ crate-public์ผ๋ก ์ฉ๋ ๋ณ๊ฒฝํ๊ณ export
๋๋ ์ธ๊ณ์ ์ผ๋ก ๋ณผ ์ ์๋ ์์ถ์ฉ์ผ๋ก ์ฌ์ฉํ๋ @matklad ์ ์์ด๋์ด๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์๋์
์ ๋นํด ๋๋ฌด ํฐ ์ฐจ์ด๊ฐ ๋ ์ ์์ต๋๊น?
pub
๋ฅผ crate-public์ผ๋ก ์ฉ๋ ๋ณ๊ฒฝํ๊ณ world-public์ ๋ํ ์๋ก์ด ๊ฐ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ํ์ฌ ๋ฒ์ ์ด์ ์ ์ ์์ด์์ต๋๋ค. ๊ธฐ์กด ์๋ฏธ์ ๋ํ ์ด๋ฌํ ๋ณ๊ฒฝ์ ์๋์
์ด๋ผ๊ณ ํด๋ ๋๋ฌด ๊ณผ๊ฐํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด pub
๊ฐ ํ์ฌ์ ์๋ฏธ๋ฅผ ์ ์งํ๊ณ ์์ต๋๋ค.
๋ ๋
ผ์๋๊ณ ๊ณ ๋ ค๋ ๊ฒ์ ๋ณดํ์ ํตํด์๋ง pub
์ ์ฉ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด์์ต๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ Lint๋ฅผ "warn on pub
$ that is not accessable the crate"์์ "warn on pub
that the crate ๋ฐ์์"๋ก ์ ํํ๊ณ ์์ํ ์ ํ์ ์ธ pub(extern)
๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. export
ํค์๋. ์ฆ, ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ณดํธ๋ผ๊ธฐ ์นจ๋ฌต ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์์ ๊ณต๊ฐ ํญ๋ชฉ๋ณด๋ค ์ธ๊ณ ๊ณต๊ฐ ํญ๋ชฉ์ด ๋ ์ ๋ค๋ ๊ฐ์ ์ ๊ธฐ์ดํ์ฌ ๋ ๋ฐฉํด๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๊ฐ์์ฑ์ ์ค์ ๋์์ผ๋ก ๋ชจ๋ ์ฌ๋์ ๋๋ฉดํ๋ ๋์ "ํ์ฌ ๋ชจ๋์์ ๋ด๋ณด๋ด๊ธฐ"๋ก pub
์ ์ง๊ด์ ์ธ(๋ฏธ๋ฌํ๊ฒ ๋ถ์ ํํ์ง๋ง) ์๋ฏธ๋ฅผ ์ ์งํฉ๋๋ค.
Rust๋ ๋งค์ฐ ์งง์ ์ฝ์ด๋ฅผ ์ข์ํ๊ณ
int
๋ ๋ถํํ๋ C/C++/Java ํผ๋์ผ๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค.
FWIW๋ ๋ ๋ฌธ์๋ง ์ ์ฅํ์ง๋ง internal
๋ฅผ ์ถ์ฝํ๋ ค๋ ๊ฒฝ์ฐ "์ฌ๋ฐ๋ฅธ" ์ฝ์ด๋ extern
al๊ณผ ์ ์ฌํ๊ฒ intern
๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ดํด๋๊ณ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง ๋ช
์ฌ์ด๊ธฐ๋ ํ๋ค๋ ๊ฒ์ ๋ถํํ ์ผ์
๋๋ค. ์ค ๊ธ์.
@glaebhoerl intern
์(๋) ๊ณ ๋ คํด์ผ ํ ์ข์ ์ต์
์
๋๋ค! โค๏ธ
extern
์์ ๋์นญ์ ์ ๋ง ์ข์ผ๋ฉฐ IMO๋ intern
์ ๋ช
์ฌ ํํ์์ ์ ์ฌ์ ์ธ ํผ๋์ ํฌ๊ฒ ์ค์
๋๋ค.
์งง๊ณ ( crate
๋ณด๋ค 1์ ๋ ๋ง์) use crate::
์ ์ถฉ๋ํ์ง ์์ต๋๋ค.
์ ๋ฐ์ดํธ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
use crate::menu::{Sound, Volume};
intern mod color;
...
/// A type for storing text and an associated color it should
/// be drawn as.
intern struct ColoredText {
intern color: types::Color,
intern text: &'static str,
}
์ ์๋ ์ธ๊ธํ์ง๋ง ๋ช ์ฌ๋ฅผ ํ์ฉ์ฌ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ค ๋ฌธ์ ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ฝํ์๋ฉด, ํ์ฉ์ฌ๋ก ์ฌ์ฉํ ์ ์๋ ๋ช ์ฌ๊ฐ ๋ง์ด ์์ต๋๋ค. ์ง ๊ณ ์์ด, ์ปดํจํฐ ๋ง์ฐ์ค, ์ปดํจํฐ ์ฑ ์ ๋ฑ... _ํ์ฉ์ฌ๋ก ์ฌ์ฉ๋๋ ์์ด ๋ช ์ฌ_์ ๋ํ Google ๊ฒ์์ ๋ชจ๋ ๋ช ์ฌ๊ฐ ํ์ฉ์ฌ๋ก ์๋ํ๋ ๊ฒ์ ์๋์ง๋ง ๋ณธ์ง์ ์ผ๋ก ์๋ชป๋ ๊ฒ์ด ์์์ ๋ํ๋ด๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํด ๋ณด์:
_crate mod hello;_ hello๋ผ๋ ์ด๋ฆ์ ํฌ๋ ์ดํธ ๋ชจ๋์ ๊ด์ฐฎ์ต๋๋ค.
_crate fn world() {}_ world๋ผ๋ ํฌ๋ ์ดํธ ํจ์๋ ๊ด์ฐฎ์ต๋๋ค.
_crate struct Foo;_ Foo๋ผ๋ ์ด๋ฆ์ ํฌ๋ ์ดํธ ๊ตฌ์กฐ์ฒด๋ ๊ด์ฐฎ์ต๋๋ค.
_crate enum Bar {}_ Bar๋ผ๋ ์ด๋ฆ์ ํฌ๋ ์ดํธ ์ด๊ฑฐํ์ ๊ด์ฐฎ์ต๋๋ค.
_crate trait Baz {}_ Baz๋ผ๋ ์์ ํน์ฑ์ ๊ด์ฐฎ์ต๋๋ค.
_crate use self::local::Foo;_ Ack, ์ด๊ฒ์ ์๋ํ์ง ์์ต๋๋ค. ํฌ๋ ์ดํธ ์ฌ์ฉ? Foo๋ผ๋ ์ด๋ฆ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅ ์์ดํ ์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ํจํด์ ๊นจ๋จ๋ฆฝ๋๋ค.
๋ํ struct ๋ฉค๋ฒ ์์์ ์ฌ์ฉํ๊ณ ๊ฒฝ๋ก์ ๋ฃจํธ๋ก crate์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ด์ํ ์ ์์ต๋๋ค.
์์๊ฐ ์๋ฒฝํ์ง๋ ์์ง๋ง '๋ช ์ฌ'๊ฐ ๊ฒฐ์ ์ ์ธ ์์๋ผ๊ณ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
๋ฌธ์ ๋ ๋งค์ฐ ๋๋ฌผ๋ค๋ ๊ฒ์ ๋๋ค. ๋ช ์ฌ๋ฅผ ์ ํ ์์ ์๋ก ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์์ต๋๋ค.
@์ผํธ๋ฆด
๋ฌธ์ ๊ฐ ๋๋ค; ๊ทธ๋ฐ ๋ค์ Rust์ ๊ตฌ๋ฌธ์ ์ดํดํ๋ IDE/์๋ํฐ๋ ๋ค๋ฅธ ์์์ผ๋ก ๋ค๋ฅธ ์์น์ ์๋ ํฌ๋ ์ดํธ ํ ํฐ์ ๊ฐ์กฐ ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ๋ ์ฐจ์ด์ ์ ์ ์ ๋ฆฌํด์ผํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ค๋ฅธ ํธ์ง๊ธฐ์ ๊ธฐ๋ฅ์ ํ๋ฅญํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ถฉ๋ถํ ๊ณ ๊ธ ํธ์ง๊ธฐ๋ฅผ ๊ฐ์ ํ๊ณ ์ธ์ด๋ฅผ ์ค๊ณํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋๋ C#์ด ์ด๋ฐ ์์ผ๋ก ์ค๊ณ๋์๋ค๊ณ ๋๊ผ๊ณ ๊ทธ๊ฒ์ด ๊ทธ ์ธ์ด์ ๋ํ ๋์ ์ข์ ์ ์ฃผ์ ์์ธ์ด์์ต๋๋ค.
@epage ์ ๋ crate
๋ฅผ ๊ฐ์กฐ ํ์์ ์๊ด์์ด ๊ฐ์์ฑ ์์ ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ฐ์กฐ ํ์๊ฐ ์ถ๊ฐ์ ์ธ ์ํ๋ผ๊ณ ์ ์ํ๋ ๊ฒ๋ฟ์
๋๋ค. ํนํ, $# crate field
$#$์ ๋ค๋ฅด๊ฒ crate::
๋ฅผ ๊ฐ์กฐ ํ์ํ๋ ๊ฒ์ ํธ์ง์๊ฐ ๋งค์ฐ ๊ฐ๋จํด์ผ ํฉ๋๋ค. ์ ์๋ ํญ์ ํ์ธํ๊ธฐ ์ฌ์ด crate
+ ::
$์ด๊ธฐ ๋๋ฌธ์
๋๋ค. crate ::foo::bar
๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค(๊ทธ๋ฌ๋ ์ด๊ฒ์ ์๋นํ ๋๋ญ
๋๋ค..).
IDE ๋ด๋น์๋ก์, ๊ทธ๋ฌํ ๊ฐ์กฐ ํ์๋ ๋งค์ฐ ์ ์ ์์ ์ ๋ณด์ ๋ํด ์๋นํ ์์ ๋
ธ์ด์ฆ๋ฅผ ์ถ๊ฐํ์ฌ ๋ถ์ ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. IMO(์ด๊ฒ์ ๋งค์ฐ ๊ฐ์ธ์ ์ด์ง๋ง ๊ฐ๋ ฅํ IDE๋ฅผ ์ฌ์ฉํ๊ณ ๊ตฌํํ์ฌ ์ ๋ณด๋ฅผ ์ป์) ๊ฐ์กฐ ํ์๋ ์๋ฏธ๋ก ์ ๋น-๋ก์ปฌ ์ ๋ณด๋ฅผ ์ ๋ฌํ ๋ ๊ฐ์ฅ ์ ์๋ํฉ๋๋ค(์ด ์ฌ์ฉ๋ฒ์ mut
๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ์ฐธ์กฐํฉ๋๊น) ๋ฐ ๊ฐ์กฐ ํ์ ์ฝ๋์ ๋ก์ปฌ "๋ณด์ผ๋ฌํ๋ ์ดํธ" ์ธก๋ฉด(๋ชจ๋ ํค์๋์ ์คํ์ผ์ด ์ ํํ ๋์ผํด์ผ ํจ).
dom
(์: ๊ตญ๋ด)๊ฐ ์ ์ฌ์ ์ธ ํ๋ณด์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ธ ๊ธ์(์ ๋ ฌํ๊ธฐ ์ข๊ณ ๊ธฐ์ตํ๊ธฐ ์ฌ์)๊ฐ ์๊ณ ๋ช ์ฌ๊ฐ ์๋๋ฉฐ 'Document Object Model' ์ธ์๋ ํน๋ณํ ๋ชจํธ์ฑ์ด ๋ถ์ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
pub struct MyStruct {
dom num: i32,
pub msg: String,
}
์๋ฌด๋ ์ด๊ฒ์ ๋ํด ์๊ฐ์ด ์์ต๋๊น?
๋ด๊ฐ ์ธ๊ธํ ๊ฒ์ ๋ณด์์ง๋ง ์์ฝ์์ ์ฐพ์ ์ ์๋ ํ ๊ฐ์ง ๊ฐ๋(btw๋ฅผ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!)๋ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ๊ธฐ์กด pub()
๊ตฌ๋ฌธ์ ๋ง๋ ๋ฐฉ๋ฒ์
๋๋ค.
pub
๋ฐ <something>
(์: crate
)์ ํน๋ณํ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ pub(<something>)
์ ๊ฐ์์ฑ๊ณผ ํ์ฅ์ฑ์ ๊ฐ์์ํต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์๋ฃจ์
์ ์ฌ์ฉํ๋ , ๋ค๋ฅธ ์๋ฃจ์
์ด ์๋๋ผ ๊ธฐ์กด ๊ธฐ๊ณ๋ฅผ ์ง์ํ๊ฑฐ๋ ๋์ฒดํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด crate
๋๋ ๊ต์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
crate(<something>)
)์ ์ ์ฉํ๋ ค๋ฉด crate
๋ฅผ ํ์ฅํด์ผ ํฉ๋๊น?pub
pub()
๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๊น?์ด๊ฒ์ ๊ณ ๋ คํ๊ณ ๋ชฉํ์ ๋ํ ์ดํด(๋ด๋ถ API์์ ๊ณต๊ฐ API๋ฅผ ๋ช
ํํ ํจ)๋ฅผ ๊ณ ๋ คํ์ฌ @vitiral ์ pub(extern)
์์ด๋์ด๋ฅผ ๋ค์ ๋ง๋ค์์ต๋๋ค.
pub
๋ฅผ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ pub(<something>)
์ ์ง๋ฆ๊ธธ๋ก ๋ง๋ค์ด ๊ธฐ์กด ๊ธฐ๊ณ๋ฅผ ๊ฐ์ ํฉ๋๋ค.public
๊ฐ ๊ณต๊ฐ API์ ์์ ์ ์์์ ์๋ฏธํ๋ ๋ค๋ฅธ ์ธ์ด์์ ์ค๋ ์ฌ๋๋ค์ ํผ๋์ํฌ ์ ์์ต๋๋ค.RE ์บก์ํ์ ๋ํ ์ํฅ
๊ธฐ์กด pub
์์คํ
์ ์ฅ์ ์ค ํ๋๋ ์บก์ํ์
๋๋ค. ์ฌ์ด ๊ฒฝ๋ก๋ API๋ฅผ ํ ๋จ๊ณ ์๋ก๋ง ๋
ธ์ถํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํฌ๋ ์ดํธ์ ์ผ๋ถ์๋ ๊ณต๊ฐํ์ง๋ง ์ ์ฒด ์์ฑ์๋ ๋น๊ณต๊ฐ๋ก ์ค์ ํ๋ ๊ฒ์ด ๋ ์ฌ์์ง๋๋ค.
pub(super)
pub(crate)
๋ํ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ์์ผ๋ฉด ์ฌ๋๋ค์ด ๋ ๋ง์ด ์ฌ์ฉํ๋๋ก ์ ๋ํ์ฌ ์ฌ๋๋ค์ด API๋ฅผ ์บก์ํํ์ง ์๋๋ก ๊ถ์ฅํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์์ ์์์ ๋ฌธํ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๊ณ ๋ คํ ๋ pub(extern)
์ ๋ํ ์์ ์๊ฒฌ์ ๋ํ ๋ ๋ค๋ฅธ ๋ฐ๋ณต์ ์ ๊ณตํฉ๋๋ค.
pub
๋ pub(super)
์ ๋ฐ๋ก ๊ฐ๊ธฐ์ฌ์ผ ํฉ๋๋ค.pub(extern)
๋ ๊ณต๊ฐ API์ ํ์ํฉ๋๋ค.๋๋ ์ด์ ์ ์ฌ๋๋ค์ด ๋ค๋ฅธ ์ธ์ด์์ ์ ํํ๋ ๊ฒ์ ๋ํ ์ฐ๋ ค๋ฅผ ์ ๊ธฐํ์ต๋๋ค. ์ด๊ฒ์ ๊ทธ๋ค๊ณผ ๋ ์ ์ด์ธ๋ฆฝ๋๋ค.
public
๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ๋ ๋ฐ์ ํ๊ฒ ์ผ์นํฉ๋๋ค.imo ์ด๊ฒ์ ๋ชจ๋ ์ธ๊ณ ์ค ์ต๊ณ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐข๊ณ ์ ์๋๋์ง ์ดํดํ๋๋ก ๋์์ฃผ์ธ์ :)
๋๋ ์ฌ์ ํ pub(foo)
๊ตฌ๋ฌธ์ ์ซ์ดํฉ๋๋ค. ๊ณผ์ฅ๋๊ฒ ๋งํ๋ฉด ํจ์ ํธ์ถ์ธ์ง ์ฌ๋ฌ ํค์๋์ ๋งค์์
์ธ์ง ํ๋จํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ฐ๋ฆฌ๋ let(mut)
๋๋ for(in)
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ๋ฌด์๊ณผ ๊ด๋ จ์ด ์์ต๋๊น?
@parasyte pub<foo>
์น๋ฆฌํฉ๋๋ค! ๊ฒฐ๊ตญ, ๊ทธ๊ฒ์ _์๊ฐ์ฑ์ ์ ํ_์ด ์๋๋๊น?
pub<crate>
๋๋ pub(crate)
์ ๋ง ๊ธฐ๋ถ์ด ์ข์ต๋๋ค.
์บ ํ๋ฅผ ๋ณ๊ฒฝํ ์ฌ๋์ ๋ช ๊ฐ์ง ์๊ฐ:
์ฒ์์ ๋๋ crate
์ ๋งค์ฐ ๋ฐ๋ํ๊ณ "์ด๊ฒ์ด ๋ฉ์ง pub
๋ฅผ ๋ง์น๊ณ ์๋ค"๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ด ํ๋ก์ ํธ ์ค ์ผ๋ถ์์ ๋๋ํ ์๋ํ๊ณ ๊ฐ๋ผ์๊ฒ ํ์ต๋๋ค.
์์งํ ๋ฉฐ์น ๋ง์ pub(X)
๋ฅผ ๋ ์ด์ ๋ณผ ์ ์์์ต๋๋ค.
์ฒ์์๋ (์๊ฐ์ ) ๋ชจํธํจ์ด ์์ ์ ์๋ค๋ ๋๋ ค์์ด ์์์ต๋๋ค. ํ์ง๋ง ์ ๊ฒ๋ ๋ฐ๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค. ์ด์ crate
๊ฐ ํ์๋๋ฉด "์์ ๋ฌผ๊ฑด"์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ๊ฐ์์ฑ์ ์ ์ธํ๋ ์๊ด์์ต๋๋ค. ์๋์ ๋ค์์ ๊ฒฝ์ฐ์ ์ ํํ ๋ฌด์์ ๋ฌธ๋งฅ์์ ๋งค์ฐ ๋ช
ํํฉ๋๋ค(์์ด์ ๋ชจํธ์ฑ ๊ฐ์ ๊ฒ).
์ด๋ค ๊ฒฝ์ฐ์๋ ์ฌ์ ํ "๋ ์ด๋ ค์ด" (์๊ฐ์ ) ๋ชจํธ์ฑ์ด ๋จ์ ์์ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์๊ฐ์ ํ ํฐํ/๋ ธ๋ ฅ ๋ ๋ ๋ชจํธํด์ง ์์ค ์ฝ๋ ๋ผ์ธ" ).
๊ทธ ๊ฐ๋์์ crate
- intern
(๋๋ ๋ค๋ฅธ ๋น๋์นญ)๋ ํ ๊ฑธ์ ๋ฌผ๋ฌ๋๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง ๊ฒ์
๋๋ค.
์ด๋ ๊ฒ ๋งํ์ง๋ง ๋ชจํธ์ฑ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ๋ํด ์ ๋ชจ๋ฆ
๋๋ค. ํ๋๋ฅผ ์ ํํด์ผ ํ๋ค๋ฉด " crate ::foo::bar
๊ทธ๋ฅ ์๋"์ ๋ํ ์ข์ ์ด์ผ๊ธฐ๋ณด๋ค " crate
๊ฐ ์์ ๋ฌผ๊ฑด์ ์๋ฏธํฉ๋๋ค"์ ๋ํ ์ข์ ์ด์ผ๊ธฐ๊ฐ ํจ์ฌ ๋ซ์ต๋๋ค.
๋ด ๋ ์ผํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
crate mod
, crate struct
, crate fn
, ... ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ์ผ๋ฉฐ ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.crate
, pub(crate)
, ...) ์ด๋ฆ์ด ์ด๋ป๊ฒ ์ง์ ๋๋์ง๋ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค.๋์๊ฒ ๋ฌ๋ ค ์๋ค๋ฉด vis
๋ฅผ ํค์๋๋ก ์ฌ์ฉํ๊ณ ๊ฐ์์ฑ ์ ํ์ ์์ ์๋ก ์ฌ์ฉํฉ๋๋ค(์: vis(pub)
, vis(crate)
๋ฑ). ๋์๊ฒ ๊ฐ๊ฐ.
์ด๋ฏธ pub
๋ฅผ "๊ฐ์์ฑ ์ง์ ์"๋ก ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ ๋ ์ค์ ๋ก crate
๋ฅผ ์ข์ํฉ๋๋ค. pub(crate)
๋ ์ด ๋ชจ๋์ ๋ํ ๊ณต๊ฐ๋ก, ํฌ๋ ์ดํธ์ ๋ํด ๋น๊ณต๊ฐ๋ก ์ฝ์ต๋๋ค. ์ฌ๊ธฐ์์ ๊ณต๊ฐ์ ๋น๊ณต๊ฐ๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
์๋ก์ด ํค์๋์ ๋ฌธ๋งฅ ํค์๋ ๋ฑ์ ๋์
ํ๋ ๊ฒ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์์ฑ์ด ๋ ๊ฐ ์๋ค๋ ๊ฒ์ ๊ฐ๋ฅด์น๋ ๊ฒ์ pub
๋ฐ crate
์์ ํ๊ณ , ํ๋๋ ๊ณต๊ฐ๋ฅผ ์๋ฏธํ๊ณ ๋ค๋ฅธ ํ๋๋ ํฌ๋ ์ดํธ์ ๋ํ ๋น๊ณต๊ฐ๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ๋ฅด์น๋ ๊ฒ์ ๋์๊ฒ ์ผ์ข
์ ์๋ฏธ๊ฐ ์์ง๋ง ์๋ง๋ ๋๋ ์ต์ํด์ก์ต๋๋ค. ์ง๋ 2์ฃผ ๋์ ์ด๋ฏธ crate
์
๋๋ค.
์ด๋ฏธ ์ฌ์ฉ๋ ํค์๋(์: crate
)๊ฐ ์๋ฏธ๋ฅผ ํตํฉํ๋ค๊ณ ์ ์ํ๋ ์ฌ๋๋ค์๊ฒ๋ ๋จ์ด ์์ฒด๋ณด๋ค ๋ฌธ๋งฅ์ด ๋ ์ค์ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋๋๋ ์ปจํ
์คํธ๋ก ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค(์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ๋ฌธ์ ์
๋๋ค): ์ด๊ฒ์ for x in y
๋ฐ impl X for Y
for
์ ์๋ฏธ๋ก ์ ์๋ฏธ๋ฅผ ํตํฉํ์ง ์๋ ์ด์ ๋ฅผ ์ค๋ช
ํฉ๋๋ค. .
๋ง์ฐฌ๊ฐ์ง๋ก crate
๋ฅผ ๊ฐ์์ฑ ํ์ ์๋ก ๋์
ํ๋ฉด ํด๋น ์๋ฏธ๊ฐ ๋ฉค๋ฒ ๋๋ ํจ์ ํ์ ์์ ์ปจํ
์คํธ์์ ์ถ๊ฐ ์ปจํ
์คํธ์ ํจ๊ป ์ ๊ณต๋ ๋ ๋ถ๋ช
ํ๊ธฐ ๋๋ฌธ์ ํผ๋์ ์ผ์ผํค์ง ์์ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, crate fn my_func();
๋ "์ด๊ฒ์ ์์์
๋๋ค"๋ก ์ฝํ์ง ์๊ณ "์ด๊ฒ์ ์์์์ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์
๋๋ค"๋ก ์ฝ์ต๋๋ค.
์ฆ, ๊ทธ๊ฒ์ด ๋ช ์ฌ๋ผ๋ ์ฌ์ค์ ์ผ๊ด์ฑ์ด ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ก์ด ๊ฐ์์ฑ ํ์ ์ ํค์๋๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
์ฌ์ค, ํ์คํ ์ฌ์ฉ์๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ ๊ฒ์ด ์๋ค๋ฉด ์ง๊ด์ ์ผ๋ก ํจ์ ํธ์ถ์ฒ๋ผ ๋ณด์ด๊ณ ์ธ์ด์ ๋ค๋ฅธ ๊ณณ์์ ๋๋ฑํ ๊ตฌ๋ฌธ์ด ์๋ pub(crate)
๊ตฌ๋ฌธ์
๋๋ค. ๋์๊ฒ ๊ทธ๊ฒ์ ์ถ์
ํ ํดํน์ฒ๋ผ ๋๊ปด์ง๋ค.
pub(crate)
์ ๋์ฒดํ์ผ๋ก crate
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์ฐ๋ ค๋ฅผ ์ ๊ธฐํ ์ฌ๋์ผ๋ก์ ๊ทธ๋ฆฌ๊ณ @aturon ์ ์ต์ ๊ฒ์๋ฌผ ์ ์ฝ์ ํ:
๊ฐ์์ฑ ์์ ์๋ก ํฌ๋ ์ดํธ ์ง์(์ฌ๊ธฐ 138์์ ์ถ์ . ์ง๊ธ๊น์ง ํผ๋๋ฐฑ์ ๊ฐ์ํ ๋ ์ด ๊ธฐ๋ฅ์ Rust 2018์์ ์์ ํ๋์ง ์์ ๊ฒ ์ ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก pub(crate)
๋ฅผ ๋ฌด์ธ๊ฐ ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ ์ ์ผ๋ก ์ฐฌ์ฑํ๋ค๋ ์ ์ ๋ถ๋ช
ํ ํ๊ณ ์ถ์ต๋๋ค(๋๋ถ๋ถ์ด ๊ทธ๋ ๋ค๊ณ ์๊ฐ ํฉ๋๋ค).
์ ํธํ๋ ์์๋๋ก, ํนํ Rust๊ฐ ์ฒ์์ด๊ฑฐ๋ ์ต์ํ์ง ์์ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
intern
(๋๋ ๋ค๋ฅธ ์ ์ฌํ ์ ํค์๋)crate
pub(crate)
ํต์ฌ ํ์ด intern
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ด ๊ถ๊ทน์ ์ผ๋ก ๊ฒฐ์ฝ ๋ฐ์๋ค์ฌ์ง์ง ์์ ๊ฒ ๊ฐ๋ค๋ฉด pub(crate)
์ ๋นํด ํฌ๊ฒ ๊ฐ์ ๋์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ crate
๋ค์ฒ์ง ๊ฒ์
๋๋ค. @Centril ๊ณผ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ถ๋ช
ํ ๋ฐํ ์ด์ .
๋ฐ๋ผ์ ํจ์ฌ ๋ ๊ฒฝํ์ด ํ๋ถํ ํต์ฌ ํ์ด ์ด๊ฒ์ด ์ต์ ์ ๊ธธ์ด๋ผ๊ณ ์๊ฐํ๋ค๋ฉด ๋๋ ์ด๊ฒ์ ๋ฐฉํดํ์ง ์์ ๊ฒ์ ๋๋ค. ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์๋ค๋ ๊ฒ์ ๊ณ ๋ คํ ๋งํ ์์ด๋์ด๋ฅผ ํํํ๋ ๊ฒ์ ๋๋ค. ๐ ๋ น!
@ralfbiedert
์ฒ์์๋ (์๊ฐ์ ) ๋ชจํธํจ์ด ์์ ์ ์๋ค๋ ๋๋ ค์์ด ์์์ต๋๋ค. ํ์ง๋ง ์ ๊ฒ๋ ์ ๋ฐ๋์ ์ผ์ด ์ผ์ด๋ฌ์ต๋๋ค. ์ง๊ธ ์์๋ฅผ ๋ณด๋ฉด ๊ทธ๊ฒ์ด "์์ ๋ฌผ๊ฑด"์ด๋ผ๋ ๊ฒ์ ์๋๋ค. ๊ทธ๊ฒ์ด ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ๊ฐ์์ฑ์ ์ ์ธํ๋ ์๊ด์์ต๋๋ค. ์๋์ ๋ค์์ ๊ฒฝ์ฐ์ ์ ํํ ๋ฌด์์ ๋ฌธ๋งฅ์์ ๋งค์ฐ ๋ช ํํฉ๋๋ค(์์ด์ ๋ชจํธ์ฑ ๊ฐ์ ๊ฒ).
@zesterer
์ด๋ฏธ ์ฌ์ฉ๋ ํค์๋(์: crate)๊ฐ ์๋ฏธ๋ฅผ ํตํฉํ๋ค๊ณ ์ ์ํ๋ ์ฌ๋๋ค์๊ฒ๋ ๋จ์ด ์์ฒด๋ณด๋ค ๋ฌธ๋งฅ์ด ๋ ์ค์ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋๋๋ ์ปจํ ์คํธ๋ก ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค(์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค). ์ด๊ฒ์ for in for x in y์ impl X for Y์ ์๋ฏธ๋ก ์ ์๋ฏธ๋ฅผ ๋ณํฉํ์ง ์๋ ์ด์ ๋ฅผ ์ค๋ช ํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ ๋ถ์ ๋ถ๋ฅด๋ ค๋ ๊ฒ์ด ์๋๋ผ ์ฌ์ฉ ํ ๋ณํ์ ์ฐฌ์ฑํ๋ ์ฌ๋๋ค์ ๋ชจ๋ฒ์ด ๋์ญ์์ค.
๋ณด๊ธฐ์๋ ์ด์ํด ๋ณด์ด์ง๋ง ๊ฐ์ฅ ํฐ ๊ฑฑ์ ์ ๋ น์ฌ์ง ์๋ ์ฌ๋๋ค์ ๋๋ค.
์ด๋ฌํ ์ฐ๋ ค๊ฐ ์ผ๋ง๋ ๋ง์ ์ํฅ์ ๋ฏธ์น๋์ง ๋ ์ ์๊ธฐ ์ํด ์ด์ ๋ํ ์ฌ์ฉ์ฑ ์ฐ๊ตฌ๋ฅผ ํ ์ ์๋ค๋ฉด ์ข๊ฒ ์ต๋๋ค.
@epage , ๋งค์ฐ ๋์ํฉ๋๋ค. Rust์ ์ฌ์ฉ์ ๋๋ฉด ๋ถ๋ถ์ UX ํ ์คํธ๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฒ ์ง๊ธ ์ผ์ด๋๊ณ ์๋ ์ผ์ด๋ผ๊ณ ์๊ฐํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ ผ์ํ๋ ์ค์ ๋๋ค.
์ด์ ๋ง๋ถ์ฌ ์ฐ๋ฆฌ ํ์ฌ์ ์ผํ์ ๊ด์ฐฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ๋ ๋ค๋ฅธ 3๋ช
๊ณผ ํจ๊ป ์ผํ๋ ์ฐ๋ฆฌ ๋ถ์์ "Rust ์นํธ์"์
๋๋ค. ๋ชจ๋ C#์ ๋ํ ํํํ ๋ฐฐ๊ฒฝ ์ง์์ ๊ฐ์ง๊ณ ์์ง๋ง Rust์๋ ๋น๊ต์ ์๋กญ์ต๋๋ค. ๋ค๋ฅธ ๋ ์๋ " crate
-stuff"์ ํจ๊ป ์ฐ๊ตฌ ํ๋ก์ ํธ๋ฅผ Rust 2018๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ์ต๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด์์ ๋ ๋ํ๋ ๋๋ต ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
"๊ทธ๋์ ์ฌ๊ธฐ์ ๋ด๊ฐ ๋ง๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ณ๊ฒฝ ์ฌํญ, ์๋ก์ด ๊ฐ์ ธ์ค๊ธฐ ์์คํ , ์์ ์๊ฐ ์์ต๋๋ค."
"๊ทธ๊ฒ ๋ฌด์จ ์ผ์ด์ผ?" (
use crate::object
๋ฐcrate x: object
๋ฅผ ๊ฐ๋ฆฌํด)
"์ด ์์์์ ๊ฐ์ ธ์ค์ธ์." ๋ฐ "๊ฐ์์ฑ ์์ ์."
"์, ์์์ด. ๋ ๋ฌ๋ผ์ง ๊ฒ ์์ด?"
ํ ๋ก ๋.
ํ์คํ, ์ฐ๋ฆฌ๋ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ํน์ ํจํด์ ์ฑํํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํด ์กฐ๊ธ ๋ ์ด์ผ๊ธฐ๋ฅผ ๋๋ด์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ ํญ๋ชฉ์ "๊ฐ๋ฅด์น๋ ์ธก๋ฉด"์ ๋ช ๋จ์ด๋ก ์์ฝ๋์ด ๊ทธ ์ดํ๋ก (๋ด๊ฐ ์๋ ํ) ์ธ๊ธ๋์ง ์์์ต๋๋ค.
๋ค์์ ์ด์ผ๊ธฐํ ๋ ๋ค๋ฅธ ์์์ด ๋ค๋ฆฌ๋ฉด ์ด ์๊ฒฌ์ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
@ralfbiedert ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@epage , ๋งค์ฐ ๋์ํฉ๋๋ค. Rust์ ์ฌ์ฉ์ ๋๋ฉด ๋ถ๋ถ์ UX ํ ์คํธ๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฒ ์ง๊ธ ์ผ์ด๋๊ณ ์๋ ์ผ์ด๋ผ๊ณ ์๊ฐํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ ผ์ํ๋ ์ค์ ๋๋ค.
์ ๋ ์ด๋ฌํ UX ์ผํ๋ฅผ ํนํ ํ์ต ๊ฐ๋ฅ์ฑ ์ธก๋ฉด์์ ์ค์ํ๊ฒ ์๊ฐํ์ง๋ง ์ด ๋ฌธ์ ์ ํ๋ก์ธ์ค๋ฅผ UX ํ ์คํธ๋ก ๊ท์ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ์๊ฒฌ์ ๋ ๊น์ ์ดํด๋ฅผ ์ป๊ณ ํธ๊ฒฌ์ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ ๋ณด๋ค ๊ณต์์ ์ธ ํ๋ก์ธ์ค๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ ๋๋ค.
๋ค์์ Rust๊ฐ ๋ค์ ์์ํ ์ฌ๋์ ๋ช ๊ฐ์ง ์๊ฐ์ ๋๋ค. ๋จผ์ , ์ด ์ธ์ด์์ ์ ๋ง ์ ์ ์ ์ด๊ณ ์ข์ ๋๋์ ์ฃผ๋ ๊ฒ์ "๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ณ๊ฒฝํ ์ ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋น๊ณต๊ฐ" โโ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
์ด์ pub
๋ ๊ฐ๋จํ๊ณ ํ๋ ์ธ์ด์์ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. Rust์ ๋งฅ๋ฝ์์ ์ด๊ฒ์ ๋ฐฐ์ฐ์ง ์๊ณ ๋์ ๋ค๋ฅธ ํค์๋๋ฅผ ๋์ฒ์ ๋ฟ๋ ค์ผ ํ๋ ๊ฒ์ ์ฝ๊ฐ ์ํด๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฏธ์ "์ด๊ฒ์ ์์์ ๋ํ๋๋ ๋ฒํผ์
๋๋ค", ์์๋ ๋ชจ๋: ๊ฐ์์ฑ "ํ ์์ค ์๋ก"๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด ์ณ๋ค๊ณ ๋๊ปด์ง๋๋ค.
๊ทธ๋์ ๋์๊ฒ pub
๋์ crate
๋๋ ๊ทธ์ ๊ฐ์ ์ฑ๊ฒฉ์ ๋ค๋ฅธ ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ต๊ฒ ๋๊ปด์ง๋๋ค. ๊ณต๊ฐ๊ฐ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํฌ๋ ์ดํธ์์ ๋ด๋ณด๋ด๋ ๊ฒ์ด ํจ์ฌ ๋ ํน๋ณํด์ผ ํฉ๋๋ค. . ์ฆ, ํฌ๋ ์ดํธ์ API๋ ํน๋ณํ ๋ฐฉ์์ผ๋ก ํ์๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ ๋ @epage ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. pub
๋ ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํ๊ณ pub(extern)
๊ฐ ๋์
๋์ด์ผ ํฉ๋๋ค. ๊ดํธ๋ก ๋ฌถ์ธ ํค์๋๋ ์ค์ ๋ก ํธ์ด ๋ง์ ๋๋์ด ๋ค๋ฏ๋ก ์ ์ฉ ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. crate
ํค์๋๋ ๊ทธ๋ฐ ์๋ฏธ์์ ์๋ํฉ๋๋ค. "๋ด๋ณด๋ธ ํฌ๋ ์ดํธ ๋ฉค๋ฒ"๋ผ๋ ์๋ฏธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ๋๋ export
์ค์ ๋ก๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด์ฉ๋ฉด ๋ด ์์ ์ ๋ชจ๋ ์์ ๊ฑฐ ๋ณด๊ด์์ด๋ฉฐ ์ด๊ฒ์ ๋ชจ๋ "ํค์๋๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค"์ ํด๋นํฉ๋๋ค. ๊ทธ๋ฌ๋ pub
๋ ๋๋ฌด ์ผ๋ฐ์ ์ด์ด์ ํน๋ณํ๊ฒ ๋๊ปด์ง์ง ์์ผ๋ฏ๋ก ์ ๋ง๋ก ํน๋ณํ ๊ฒ์ ๋ํ๋ด์ง ์์์ผ ํฉ๋๋ค(crate-exported API).
์ด๋ฒ ์ฃผ๋ง์ RustConf์์ ์ฝ๋ ์ํ์ pub(crate)
๋ฅผ ๋ง์ด ์ฌ์ฉํ ๊ฐ์ฐ์ ๋ดค๋๋ฐ ์ ๋ง ํ๋ฒํ crate
๋ฅผ ์ํ๊ฒ ๋์์ต๋๋ค. ๋๋ ์ฌ์ ํ ์๋ ๊ณํ์ ๋งค์ฐ ํ๋ก์
๋๋ค.
@steveklabnik
์ ๋ ์ด๋ฒ ์ฃผ๋ง์ RustConf์์ ์ฝ๋ ์ํ์ ๋ง์ pub(crate)๋ฅผ ์ฌ์ฉํ ๊ฐ์ฐ์ ๋ณด์๋๋ฐ, ์ ๋ง์ด์ง ํ๋ฒํ ์ค๋๋ ํฌ๋ ์ดํธ๋ฅผ ์ํ๊ฒ ๋์์ต๋๋ค. ๋๋ ์ฌ์ ํ ์๋ ๊ณํ์ ๋งค์ฐ ํ๋ก์ ๋๋ค.
์ด ์ฃผ์์ ์ปจํ
์คํธ๋ ๋๋ถ๋ถ RustConf์์ ๊ฐ์ ธ์จ ๊ฒ์
๋๊น, ์๋๋ฉด ์ด ์ค๋ ๋๋ฅผ ๊ณ ๋ คํ๊ณ ์ด์ ๋ํ ๋ถ์ผ์น๋ฅผ ์ ์ ๋ก ํฉ๋๊น? ์ด์ ์ pub(crate)
๊ฐ ์๋๋ผ pub
๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ์๊ตฌ ์ฌํญ์ ๋ํ ๋์ ์๋ฃจ์
์ ์ ๊ณตํ์ผ๋ฉฐ ์ด๊ฒ์ด ์ฌ๋๋ค์ ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํฌ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ณด๋ค
@superseed
๊ทธ๋์ ์ ๋ @epage ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. pub๋ ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํ๊ณ ์ผ์ข ์ pub(extern)์ด ๋์ ๋์ด์ผ ํฉ๋๋ค. ๊ดํธ๋ก ๋ฌถ์ธ ํค์๋๋ ์ค์ ๋ก ํธ์ด ๋ง์ ๋๋์ด ๋ค๋ฏ๋ก ์ ์ฉ ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. crate ํค์๋๋ ๊ทธ๋ฐ ์๋ฏธ์์ ์๋ํฉ๋๋ค. "๋ด๋ณด๋ธ ํฌ๋ ์ดํธ ๋ฉค๋ฒ"๋ผ๋ ์๋ฏธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์๋๋ฉด ์ค์ ๋ก ์์ถํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด์ฉ๋ฉด ๋ด ์์ ์ ๋ชจ๋ ์์ ๊ฑฐ ๋ณด๊ด์์ด๋ฉฐ ์ด๊ฒ์ ๋ชจ๋ "ํค์๋๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค"์ ํด๋นํฉ๋๋ค. ๊ทธ๋ฌ๋ pub์ ๋๋ฌด ์ผ๋ฐ์ ์ด์ด์ ํน๋ณํ๊ฒ ๋๊ปด์ง์ง ์์ผ๋ฏ๋ก ์ ๋ง๋ก ํน๋ณํ ๊ฒ์ ๋ํ๋ด์ง ์์์ผ ํฉ๋๋ค(crate-exported API).
RE "๊ดํธ๋ก ๋ฌถ์ธ ํค์๋๋ ์ ๋ง ํธ์ด ๋ง์ ๋๋์ด ๋ค์ง๋ง"
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ทธ๊ฒ๋ค์ ๋ํด ์์์ ๋ ๊ทธ๊ฒ๋ค์ด ๊น๋ํ๋ค๊ณ ์๊ฐํ์ง๋ง(all-or-nothing friend
๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค), ๋ ํฐ ๊ด์ฌ์ฌ๋ ๋ณ๋ ฌ ๊ตฌ๋ฌธ์ ๋ง๋ค์ง ์๊ณ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฒ์ ์์ฉํ๊ฑฐ๋ ์ฐพ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋์ฒด ์๋ฃจ์
.
๋ฐ๋ฉด์...
RE ๋๋ export
์ค์ ๋ก,
export
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด $ crate
์ ๋ฌ๋ฆฌ ์ด์ ์๊ฒฌ๊ณผ ๋ชจ์๋๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด ์ปจํ
์คํธ์์ export
๋ ๊ฐ์์ฑ๊ณผ ๋ค๋ฅด๊ฒ ์ทจ๊ธ๋ ์ ์์ต๋๋ค. export
๋ pub(crate)
๋ฅผ ์๋ฏธํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ฐ๋ฅด์น๋ ๋ฐ ํฐ ๋ฌธ์ ๊ฐ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋ด ์๋ ์์ด๋์ด์ ํ์ฅ์ ๋ํด ์ด๋ ์ชฝ์ด๋ ๊ฐ ์ ์์ต๋๋ค.
@superseed
pub
[โฆ] ๊ฐ์์ฑ "ํ ๋จ๊ณ ์๋ก".
crate
ํค์๋๋ ๊ทธ๋ฐ ์๋ฏธ์์ ์๋ํฉ๋๋ค. "๋ด๋ณด๋ธ ํฌ๋ ์ดํธ ๋ฉค๋ฒ"๋ผ๋ ์๋ฏธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ด ๋ ํค์๋์ ์๋ฏธ์ ๋ํ ๊ทํ์ ์ดํด๋ ์ฌ๊ธฐ์์ ์ ์๋ ๊ฒ๊ณผ ์ ๋ฐ๋์ผ ์ ์์ต๋๋ค. pub
๋ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ณต๊ฐ๋ฅผ ์๋ฏธํ๊ณ crate
๋ ๋์ผํ ์์์์ ์ก์ธ์คํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
@epage
pub(crate)
์ ๊ฒฝ์ฐ ์ ๋ง ๊น๋ํ ๊ธฐ๋ฅ ์ ์ ๊ณตํ๊ณ ์ค์ ๋ก ์ ์ฝํ์ง๋ง ๋ด ๋์๋ ๋๋ฌด ๋ง์ ํจ์ ํธ์ถ์ฒ๋ผ ๋ณด์
๋๋ค. ์ฆ, ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์๊ฐ ์์ผ๋ฉด ์๋ง ์ ๋ง ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๊ณ ๊ฐ์กฐ ํ์๋ ์ธ์ด์ ์๋ฏธ๋ฅผ ์ดํดํ๋ ๋ฐ ํ์ํ์ง ์์์ผ ํฉ๋๋ค.
@SimonSapin
์ค์ ๋ก, ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ์ดํด๋์ด์ผ ํ๋ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง crate
-- ๋ช
์ฌ์ด๊ธฐ ๋๋ฌธ์ -- ํฌ๋ ์ดํธ(?) ๋๋ ํฌ๋ ์ดํธ์ ์์ฑ์ ์ ์ธํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ ์ธํ๊ณ ์๊ฒฉ ์ด ์์ ์ ๊ฐ์กฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ public
/ pub
๋ ์ด๋์์๋ ๋ณผ ์ ์๋ ํ์ ์ด์ด๋ฉฐ "์ด๊ฒ์ ์์ ๋ฐ์ผ๋ก ๋ด๋ณด๋ธ ๊ฒ"์ ์๋ฏธํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง์ง ์์ต๋๋ค. struct
ํ์ ๊ฐ์์ฑ์ ๊ฒ์ฆํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด "์ด๊ฒ์ ๋ด๊ฐ ์ํ ์ปจํ
์คํธ ์ธ๋ถ์์ ๋ณผ ์ ์์ต๋๋ค"๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. t ๊ทธ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ๋ณํ๊ณ ์๋ค๊ณ ์๊ฐํ์ญ์์ค).
๊ทธ๋ฆฌ๊ณ public/pub๋ ์ ๋น์ฟผํฐ์ค ์์์ด์ด๋ฉฐ "์ด๊ฒ์ ์์ ๋ฐ์ผ๋ก ๋ด๋ณด๋ธ ๊ฒ"์ ์๋ฏธํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง์ง ์์ต๋๋ค. "์ด๊ฒ์ ๋ด๊ฐ ์๋ ์ปจํ ์คํธ ์ธ๋ถ์์ ๋ณผ ์ ์์ต๋๋ค"๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ ๊ฐ์์ฑ์ ํ์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ํ๋ ธ์ง๋ง ์๋ฏธ ์ฒด๊ณ๊ฐ ์ด ๊ฒฝ์ฐ ๋ณ๊ฒฝ).
pub
๋ ํญ์ "์ด๊ฒ์ ์์ ๋ฐ์ผ๋ก ๋ด๋ณด๋ด์ง๋๋ค"๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋ผ ์ด๋ฏธ ์๋ ๊ทธ๋๋ก์
๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๋ ์ง ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ ์ฌ์ค์ด ์ pub(crate)
๊ฐ์์ฑ ์์ค์ด ์ ํ ์ถ์ง๋์ง ์๋์ง์
๋๋ค.
ํ์ ํญ์ "์ด๊ฒ์ ์์์์ ๋ด๋ณด๋ ๋๋ค"๋ฅผ ์๋ฏธํ์ต๋๋ค.
์ด ์ดํด๊ฐ ์ ์ฒด ๊ทธ๋ฆผ์ด ์๋๊ธฐ ๋๋ฌธ์ ํผ๋์ ์ผ์ผํฌ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. pub
๋ "์ด ๋ชจ๋ ์ธ๋ถ์ ๋๊ฐ ์ด ํญ๋ชฉ/ํ๋/๋ฉ์๋์ ์ก์ธ์คํ๋์ง ์๊ดํ์ง ์์ต๋๋ค"๋ฅผ ์๋ฏธํฉ๋๋ค. ํฌ๋ ์ดํธ์์ ๋ด๋ณด๋ด๋ ค๋ฉด ํญ๋ชฉ ๊ฒฝ๋ก์๋ ๋์ผํ pub
์์ ์๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ด ์ธ๋ถ ์ฌํญ์ ๋ง์ ์ธ์ด์์ ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ unreachable_pub
๋ณดํธ๋ผ๊ธฐ์ ๊ด์ฌ์ด ์๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค. ์ด๊ฒ์ด ์ด ๋ฌธ์ ๋ฅผ ๋๋ฌด ๋ง์ด ๋ฐ์ด๋ถ์ด๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ต์์ ๋ ๋ฒจ์์ ์ ๋ ๋ด๋ณด๋ด์ง ์๋ ์ ํ์ด ์๋ ๊ฒฝ์ฐ pub
๋ฉ์๋๋ผ๊ณ ํ์ํ๋ ๊ฒ์ด ๊ท์ฐฎ์ ์ผ์
๋๋ค.
@rpjohnst ๊ทธ๊ฒ์ด ํญ์ ์๋ฏธํ๋ ๋ฐ์
๋๊น? ์์๋ฅผ ๋ด๋ณด๋ธ ์์์ ์๋จ์์ "visible from super
"์ ์ฌ์ฌ์ด ์๋์๊ณ ๋ฆฌํ ์์ ์์ฒด๋ฅผ pub
๋ก ๊ท์ ํ์ง ์์์ต๋๊น?
์๋์, ๊ทธ๊ฒ์ด ์ ์ฒด ์ด์ผ๊ธฐ๊ฐ ์๋๋ฉฐ @seanmonstar ์ ์ค๋ช
์ด ๋๋จธ์ง๋ฅผ ์์ํฉ๋๋ค. ๊ฐ์ฅ ํฐ ์์ธ๋ ์ฌ์์ถ์
๋๋ค. ๋ถ๋ชจ ๋ชจ๋์ด ๋น๊ณต๊ฐ์ธ ํญ๋ชฉ์ pub use
ํ ์ ์์ต๋๋ค. ๋ ์ด์ํ ์๋ ์ด๊ฒ ๊ณผ ๊ฐ์ผ๋ฉฐ, ์์ ๋ชจ๋์ด ๋น๊ณต๊ฐ์ธ ๊ฒฝ์ฐ์๋ ๊ณต๊ฐ ์ธํฐํ์ด์ค์์ pub
ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด $ pub use
pub(crate)
pub
๋ ๋ฎ์ ๊ฐ์์ฑ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฐํํ ์ ์์ต๋๋ค . pub use
์์ฒด๊ฐ ์์ ๋ฐ์์๋ ๋ณด์ด์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ํญ๋ชฉ ์์ฒด์ ๊ฐ์์ฑ์ super
์ ๋ํ ๊ฐ์์ฑ์ ๋ํ ์ง์ ์ ์ธ ๊ฒ์ด ์๋๋ผ ๊ฐ์์ฑ ์ "์ํ"์ ๊ดํ ๊ฒ์
๋๋ค.
์ค์ค ๊ทธ๋ ๊ตฐ์ ์ค๋ช ๊ฐ์ฌํฉ๋๋ค! ํจ์ฌ ๋ ์์งํ ๋ชจ๋ธ์ ์ผ๋์ ๋์์ต๋๋ค. "ํ์ ํ์ฌ ์๋ฏธ"์ ๋ํ ์ด์ ์๊ฒฌ๊ณผ ๊ด๋ จํ์ฌ ๋ ํฉ๋ฆฌ์ ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ค๋ @rust-lang/lang ํ์์์ ๊ฐ๋ตํ๊ฒ ๋ ผ์ํ์ต๋๋ค.
crate::foo::bar
๊ฒฝ๋ก์ ๊ฒฐํฉํ ๋ ํผ๋์ ์ผ๊ธฐํ ์ ์๋์ง ์ฌ๋ถ์ ๋ํด ์ฌ์ ํ ์๊ตฌ์ฌ ์ด ์์ต๋๋ค.struct Foo ( crate :: foo :: Bar )
๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํด์ผ ํ๋ค๋ ์ ์ ์ง์ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค. (crate::foo::Bar)
์ ํ์ ๊ฐ์ธ ํ๋์ธ์ง ์๋๋ฉด crate
ํ๋์ธ์ง ::foo::Bar
์ ํ ?๋ต๋ณ: ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ฒฝ๋ก( ๋์ดํฐ )๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
์ด๊ฒ์ ::foo::bar
๊ฒฝ๋ก๊ฐ ์ ์ ๋ ๋๋ฌผ์ด ์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์๋ง๋ ๋์๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ์ด์ ๋ํด ๊ธ์ ์ ์ผ๋ก ์๊ฐํ์ง๋ง ํค์๋ ์ ํ๊ณผ crate::foo::bar ๊ฒฝ๋ก์ ๊ฒฐํฉํ ๋ ํผ๋์ ์ผ์ผํฌ ์ ์๋์ง ์ฌ๋ถ์ ๋ํด ์ฌ์ ํ ์๋ฌธ์ ์ด ์์ต๋๋ค.
@nikomatsakis ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ผ์ก์ ํ์ ๋ฉ๋ชจ๋ ์์ฝ์ด ์์ต๋๊น? ์ด ์ค๋ ๋ ๋ด์์ ๋ด ๊ด์ฌ์ฌ[0] ์ค ํ๋ ์ด์์ ๋ํด ๋ ผ์ํ ์ ๋ ์๊ณ ๋ฐ๋ ์ ์์ ๋ํ ๋ง์ ๋ ผ์๋ ๋ณธ ์ ์ด ์์ต๋๋ค. ์๋ง๋ [0]๊ณผ ๋ค๋ฅธ ๊ฒ๋ค ์ค ์ผ๋ถ๋ ๋ค์ํ ๋ด๋ถ ์ค๋ ๋์์ ๋ ผ์๋์์ง๋ง ํ๊ณ ๋ค์ด์ผ ํ ๊ฒ์ด ๋ง์ต๋๋ค.
[0] pub(...)
๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์์ฉํด์ผ ํ๋ค๋ ๋๋์ผ๋ก pub(...)
๋ฅผ ๋ชจํธํ ์ํ๋ก ๋ฐ์ด๋ฃ๋ ๋ณ๋ ฌ ๊ฐ์์ฑ ๊ตฌ๋ฌธ ์์ฑ
@epage
@nikomatsakis ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ผ์ก์ ํ์ ๋ฉ๋ชจ๋ ์์ฝ์ด ์์ต๋๊น?
์ฃ์กํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์์ฃผ ์ค๋ซ๋์(์ต๋ ๋ช ๋ถ) ๋ ผ์ํ์ง ์์์ผ๋ฉฐ ์ด์ ๋ํ ํ์๋ก๋ ์์ฑํ์ง ์์์ต๋๋ค.
@eddyb ๋ my
๋ฅผ ๋ ์งง๊ณ ์ธ์ฒด๊ณตํ์ ์ธ ๊ฐ์์ฑ ์์ ์๋ก ๊ฐ๋ตํ๊ฒ ์ธ๊ธํ์ต๋๋ค.
mine
๋ผ๊ณ ํ๋ ๊ฒ ๊ฐ์๋ฐ my
๋ ๋ ์งง๊ณ ์ฌ๋์ค๋ฝ์ต๋๋ค!
(์ฐธ๊ณ ๋ก ์ ๋ ํ์์์ ๋ฐ ๋๋ด์ด์์ต๋๋ค)
ํธ์ง : my
๊ฐ crate-local์ด๋ฉด pub
๋ฅผ our
๋ก ๋ฐ๊ฟ ์ ์์ต๋๊น? ์:
our struct Foo(my FooImpl);
(์ฐธ๊ณ ๋ก ์ ๋ ํ์์์ ๋ฐ ๋๋ด์ด์์ต๋๋ค)
my
๊ฐ crate-local์ด๋ฉดpub
๋ฅผour
๋ก ๋ฐ๊ฟ ์ ์์ต๋๊น?
Perl: ๋๋ด์ ํ์ค๋ก ๋ง๋ญ๋๋ค.
https://perldoc.perl.org/functions/my.html
https://perldoc.perl.org/functions/our.html
my
๋ ํ๋ฅญํ๊ณ (์ด์ ์๋ ๋ฑ์ฅํ ์ ์ด ์์ต๋๋ค), ๋ฌธ์ ๋ local
, internal
๋๋ ๋ฌด์๊ณผ ๊ด๋ จํ์ฌ ๋ฌด์ ๋ณด๋ค ๋ช
ํํ์ง ์๋ค๋ ๊ฒ์
๋๋ค(๋๋ ๊ทธ ๊ฒฝ์ฐ, ๋๊ตฌ์ ), ์ด๊ฒ์ด ์ ์ฒด ๋ฌธ์ ์
๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฒํ ์ด์ํ ์ํฉ์ "์์ ํ ๊ณต๊ฐ๋", "์์ ํ ๋น๊ณต๊ฐ์ ์ธ" ๋ฐ "์ค๊ฐ์ ์๋"(์ฆ, ํฌ๋ ์ดํธ ์์ค)์ ์ธ ๊ฐ์ง ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ์์ค์ ์ํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ์ ์ฝ์ผ๋ก ์ธํด ์ด ์ค ์ฒซ ๋ฒ์งธ๋ ๋ฐ๋์ pub
์ด๊ณ ๋ ๋ฒ์งธ๋ ๋ฌต์์ ๊ธฐ๋ณธ๊ฐ์ด๋ฉฐ ์ธ ๋ฒ์งธ๋ ์๋ก์ด ๊ฒ์ ์ ์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ด์๋ "์์ ํ ๊ธ๋ก๋ฒํ์ง๋ ์๊ณ , ์์ ํ ์ง์ญ์ ์ด์ง๋ ์์ง๋ง, ๊ทธ ์ฌ์ด ์ด๋๊ฐ์"๋ฅผ ์ ํํ๊ฒ ๋ํ๋ด๋ ๋จ์ด๊ฐ ๋ง์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ crate
ํค์๋๋ ์ค์ ๋ฒ์๊ฐ ๋ฌด์ ์ธ์ง ์ ํํ ์ด๋ฆ์ ๋์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ง์กฑ์ํค๋ ํค์๋์
๋๋ค. ๋ฐ๋ก ํฌ๋ ์ดํธ์
๋๋ค. ๊ทธ๋ฌ๋ ("๋๋ ๊ทธ๊ฒ์ ์๊ณ ์์๋ค!"๋ฅผ ๋๋๊ธฐ ์ ์) ์ด๊ฒ์ ๋๊ฐ๋ ๊ทธ๊ฒ์ด ๊ฐ์์ฑ ์์ ์๋ผ๋ ๊ฒ์ด ๋ ์ด์ ๋ถ๋ช
ํ์ง ์๋ค๋ ๊ฒ ์
๋๋ค. "Pub"์ "public"์ ์ค์๋ง๋ก ์ง๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ธ์ด์๋ (๊ทธ ์ด๋ฆ์ ๊ฐ์ง) "์์"์ ๊ฐ๋
์ด ์์ต๋๋ค. crate struct
์ ์๋ฏธ ๋ฅผ ์ดํดํ๋ ค๋ฉด ๋จผ์ ์ด๊ฒ์ ๋ํด ๋ฐฐ์์ผ ํฉ๋๋ค. 1 '์ธ์ด์ด์์์ฐ'์์ ์ถ๊ฐ ์ฒ ์๋ฅผ ์๊ตฌํ๋ฉฐ, ์์ง๊น์ง ์๊ณ ๊ฐ ๊ธ์ ์ ์ธ์ง์ ๋ํด์๋ ์๊ฒฌ์ด ์๊ฐ๋ฆด ์ ์๋ค.
ํํธ pub(crate)
๋ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํด๊ฒฐํฉ๋๋ค. ๊ฐ์์ฑ ์์ ์์ด๋ฉฐ ๋ฒ์๊ฐ ๋ฌด์์ธ์ง ์๋ ค์ค๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋๊ฐ๋ก ๊ธธ๊ณ ์ด์ํฉ๋๋ค.
์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณค๊ฒฝ์ ํํ์ ๋๋ค.
1 (์์ ๋๊ตฐ๊ฐ๊ฐ " crate
๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ๋ฌผ์๊ณ ๋๋ ๊ทธ๊ฒ์ด ๊ฐ์์ฑ ์์ ์๋ผ๊ณ ๋งํ๊ณ ๊ทธ๊ฒ์ด ๋์ด์์ต๋๋ค"๋ผ๋ ์ํธ ์์ฉ์ ์ค๋ช
ํ์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๊ณ ์๋ง๋ ๋ ์ผ๋ฐ์ ์ธ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋น์ ์์ Rustacean์ด ์์ ์์ง๋ ์์ต๋๋ค.)
FWIW, ์์ ๋ก์ปฌ ํญ๋ชฉ์ ๊ฒฝ์ฐ our
๋๋ my
๋ก ์์ ํ ๊ด์ฐฎ์ต๋๋ค.
our
๋ ์ธ ๊ธ์๋ก ๋ ํค์๋์ด๋ฉฐ pub
~๋ฐ Perl~๊ณผ ์ ์ด์ธ๋ฆฝ๋๋ค.
๋๋ฌด ๋น๊ณต์์ ์ผ๋ก ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ฌธ์ ์
๋๊น(์์ด ์์ด๋ฏผ์๊ฒ?)?
์ฌ๋๋ค์ intern
์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํฉ๋๊น? crate
๋ณด๋ค ํ ๋ฌธ์ ๋ ๊ธธ์ง๋ง, ๊ทธ ์ธ์๋ Rust๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์๊ฒ crate
๋ณด๋ค ์ง๊ด์ ์ด๊ณ $ extern
ํค์๋์ ์ข์ ๋์นญ์ ์ด๋ฃน๋๋ค.
IMO our
๋ฐ my
๋ local
๋ฐ internal
$์ ๋์ผํ ์ฝ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฒ์๊ฐ ๋ช
ํํ์ง ์์ต๋๋ค. local
๋ ๋ฒ์๊ฐ ๋ก์ปฌ ๋ณ์์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์๋นํ ํผ๋์ค๋ฝ์ต๋๋ค. internal
๊ฐ ์ฝ๊ฐ ๋ถํน์ ํฉ๋๋ค. ๋ฌด์์ ๋ํ ๋ด๋ถ? ๋ชจ๋? ์ ํ? ์์? ๊ทธ๊ฒ์ด ์ฌ์ฉ๋๋ ์ธ์ด์์ ์จ ์ฌ๋๋ค์๊ฒ๋ ๋ถ๋ช
ํ ์ ์์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค. our
๋ฐ my
๋ ํจ์ฌ ๋ ๋ชจํธํฉ๋๋ค. ๋์กฐ์ ์ผ๋ก crate
๋ ๋ฒ์์ ๋ํด ๋งค์ฐ ๋ช
ํํฉ๋๋ค.
pub(extern)
์ ๋ํด ์ค์ ๋ก ์ง๋ฌธ์ด ์์ต๋๋ค. pub
์์ extern "C" fn foo() {}
๊ฐ ์๋ค๋ ๊ฒ์ด ๋ง์ด ๋ฉ๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ "C"๊ฐ ์๋ ์ผ๋ฐ Rust ํจ์์๋ extern fn foo() {}
๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. FFI์ ๋ํด extern ๊ตฌ๋ฌธ์ ํน๋ณํ๊ฒ ์ ์งํ์ง ์๊ณ ์ด๋ฅผ ํตํฉํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ฆ, extern
๋ ์ด์ pub(extern)
, pub
๋ ํ์ฌ์ ๋์ผํ๊ฒ ์ ์ง๋์ง๋ง ํญ๋ชฉ์ด ์ง์ํ๋ ๊ฒฝ์ฐ ์ ํ์ ABI ๋ฌธ์์ด์ ํ์ฉํ๊ณ pub
์ ๋ํ ๋ณดํธ๋ผ๊ธฐ๋ฅผ ํ์ฉํฉ๋๋ค. pub(extern)
๋๋ extern
์์ด ๋ด๋ณด๋ด๊ณ ์์ต๋๋ค.
extern fn foo() {
println!("Just called a Rust function from Rust!");
}
#[no_mangle]
extern "C" fn foo_from_c() {
println!("Just called a Rust function from C!");
}
๋ด๊ฐ ์ฝ์ ์ค๋ ๋์์ ์ธ๊ธ๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ผ๋ฏ๋ก ์ด์ ์ ๋ ผ์๋ ์ ์ด ์๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค!
์์ ํ ์์ด
extern "C" fn foo() {}
๊ฐ ์๋ค๋ ๊ฒ์ด ๋ง์ด ๋ฉ๋๊น?
์- ์๋ฅผ ๋ค์ด foo
๋ฅผ ํจ์ ํฌ์ธํฐ๋ก๋ง ์ฌ์ฉํ๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ค $ "C"
๋ ๊ธฐ๋ณธ์ ์ผ๋ก C ABI๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ extern
extern fn foo() {}
๊ตฌ๋ฌธ์ ์ฌ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๊ฒ์ ์ ์ด๋ ์ผ๋ถ์์๋ ๊ด์ฉ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๊ธฐ ์ค๋์ ์ ์ ์๋ ๋ด์ฉ์ด ์์ต๋๋ค. ์ด์ ์ ๋ชจ๋ ์์คํ ์ ์ผ๋ถ ์ธก๋ฉด์ด ๊ฒฐ์ ํ๋์์ผ๋ฏ๋ก ๋ค์ ํ ๋ฒ ๊ธฐํ๋ฅผ ์ค ์ ์์ต๋๊น?
// Public to the world.
pub struct Foo;
// Private to the crate.
priv struct Foo;
// Basically not visible at all (only inside the module).
struct Foo;
๋ค์์ ์๊ฐํ๋ฉด ์ด๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ค ์ฌ๋๋ค์ priv
๊ฐ ๊ฐ์ฅ ์ ํ์ ์ธ ๊ฒ์ด ์๋ ๊ฒ์ ๋ํด ๋ฌด๋ฆ์ ๊ฟ๋ ๋ฐ์์ ๋ณด์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ๊ทธ๊ฒ์ ๋ํด ๋ ๊ฐ์ง ์์ ์ ๋งํ๊ณ ์ถ์ต๋๋ค.
Rust์์ ๋ชจ๋์ ๋ค์์คํ์ด์ค ์๋์ ์๋ ๊ฒ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ๋ฉด ํฌ๋ ์ดํธ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํฌ๋ ์ดํธ๊ฐ "API ๋จ์"์ธ ๊ฒฝ์ฐ ๊ฐ์์ฑ ์์ ์๊ฐ ์ฃผ๋ก ํฌ๋ ์ดํธ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
Java๊ฐ "ํด๋์ค์ ๋ํ ๋น๊ณต๊ฐ"๋ฅผ ์๋ฏธํ๋ private
์ "ํจํค์ง ๋ด๋ถ์์ ๋ณผ ์ ์์"์ ์๋ฏธํ๋ ๊ฐ์์ฑ ์์ ์๊ฐ ์๋ ์ค์๋ฅผ ์ ์ง๋ ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์๊ฒ๋ ์์ ์๊ฐ ์๋ ๊ฒ(์ฆ, ๊ธฐ๋ณธ๊ฐ)์ด ๊ฐ์ฅ ์ ํ์ ์ด๋ผ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์
๋๋ค.
@stjepang ๋๋ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ํฉ์์ "๋น๊ณต๊ฐ"๊ฐ ์์ ๋์ง ์์ ์ํ๋ณด๋ค ๋ ์ ํ์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก private-default-public ์คํํธ๋ผ์ protected-available-advertised์ ์ ์ฌํฉ๋๋ค.
ํ๋ผ์ด๋น ํด๋ฝ์ ํด๋ฝ๋ณด๋ค ๋ ๋
์ ์ ์
๋๋ค.
์ฌ์ ์ธ ํ์๋ ์ผ๋ฐ์ ์ธ ๊ด์ ์์ ์จ๊ธฐ๊ธฐ ์ํด ์ด๋ ์ ๋ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์์์ ์๋ฏธํฉ๋๋ค.
์ฌ์ ์ธ ์๊ฐ์ ์งํ๊ฐ ์ฐ๋ฆฌ์๊ฒ ํ
๋ ํ์๋ฅผ ๋ถ์ฌํ๋ ๋ฐ ์คํจํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ค๋ณต๋ ๊ฐ๋
์ด์ด์ผ ํ์ง๋ง ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ๊ณต์ ํ์ง ์์ผ๋ ค๋ ์๊ฐ์ ์๋ฏธํ๋ ๊ฒ์ผ๋ก ์ธ์ํฉ๋๋ค.
๊ฒฝํ์ด ์๋ ์ธ์ด ํ์ต์๋ก์, ๋๋ ์ถ๊ฐ ํค์๋๊ฐ ์ฌ๋ฌ ๋ฌธ๋งฅ ์์กด์ ์๋ฏธ๋ฅผ ๊ฐ๋ ๋จ์ผ ํค์๋๋ณด๋ค ์ธ์ง์ ๋ถ๋ด์ด ๋ํ๋ค๊ณ ์ ์ํฉ๋๋ค. Costello, L ๋ฐ Abbot, B "๋๊ฐ ๋จผ์ ๊ฐ๋๊ฐ", 1938๋ ์ฐธ์กฐ.
my
๋ฐ our
์๋ ์ฐ๋ฆฌ๊ฐ ์ํ์ง ์๋ ํจ์ถ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํค์๋๋ก ์์ฝํ๋ ์ด๋ ค์์ ์ ์ณ๋๊ณ ์. ๊ทธ๋ค์ ์ฌ๋ฏธ์๋ ๋๋ด์ ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๊ทธ ๊ธธ์ ๊ฐ์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์์งํ ์ฌ๋๋ค์ด crate
๊ฐ์์ฑ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ํฐ ๋ฌธ์ ๋ ์ฝ๊ธฐ ์ด๋ ต๊ฑฐ๋ ๊ตฌ๋ฌธ ๋ถ์ํ๊ธฐ ๋ชจํธํด์ง๋ ์ฝ๋์์ ๋น๋กฏ๋ฉ๋๋ค.
crate struct S(crate crate::Foo);
crate struct S(crate ::Foo);
๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ๋ค์ ์ผ์คํ ํผ๋ก ๋ณด์ง ์์ง๋ง ์ฌ๊ธฐ์์๋ ๋ถ๋ช ํ ์ ๋นํ ์ฐ๋ ค์ ๋๋ค.
์ค์นผ๋ผ ์ธ์ด์๋ pub(path)
์ ์ ์ฌํ private[path]
๊ฐ ์์ผ๋ฉฐ ๊ฑฐ์ โโ๋์ผํ๊ฒ ์๋ํฉ๋๋ค. "์ด ํญ๋ชฉ์ ๋น๊ณต๊ฐ์ด๋ฉฐ $path ๋ด์ ์ฌ๋๋ค๋ง ๋ณผ ์ ์๋๋ก ํ์ฉํฉ๋๋ค"๋ผ๊ณ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ์ฝ์ต๋๋ค. ํ์ง๋ง ์ค์นผ๋ผ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋น๊ณต๊ฐ๋ก ๋ง๋ค๋ ค๋ฉด ์ฃผ์์ด ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๊ณต๊ฐ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. Rust์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
friend
s ์ C++ ๊ฐ๋
๋ pub(path)
์ ์ ์ฌํ ์ ๋ก๋ก ์๊ฐ๋ฉ๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
crate
ํค์๋๋ ์๋ ๊ฒฝ๋ก ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์์ฑ ์์ ์ ๋ชจ๋์ ์ฌ์ฉ๋ฉ๋๋ค.crate
ํค์๋๋ pub(...)
์ ๊ฐ์ ํตํฉ ๊ฐ์์ฑ ์์ ์ ๊ตฌ๋ฌธ์ ๋ฐฉ์งํฉ๋๋ค.pub(crate)
๊ตฌ๋ฌธ์ ์ซ์ดํฉ๋๋ค(๋๋ฌด ๊ธธ๋ฉด ํจ์ ํธ์ถ์ฒ๋ผ ๋ณด์
๋๋ค).5๋ถ ๋์ ์ ๋ง ๊น์ด ๊ณ ๋ฏผํ ๋์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๋ก ์ด ๋์์ต๋๋ค... :P
_( @
๋ฅผ ์๋ก ์ฌ์ฉ)_
<strong i="18">@pub</strong> use crate::Foo;
<strong i="19">@crate</strong> struct Bar;
๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ด ๊ฝค ์ถํ๋ค๊ณ ์๊ฐํ๊ณ @crate
๋๋ pub(crate)
๋ฅผ ์
๋ ฅํ๊ณ ์ถ์ง ์์ต๋๋ค.
pub
๋ฐ extern
๊ฐ ์ด๋ฏธ ์์ผ๋ฏ๋ก crate
ํค์๋๊ฐ ์์ฃผ ์ ๋ง๋๋ค๊ณ ์๊ฐํฉ๋๋ค(์ผ๋ฐ์ ์ธ public
, protected
, private
ํค์๋).
crate struct Foo;
crate fn path() -> PathBuf { ... }
๊ทธ๋ฌ๋ ๋ด๊ฐ ๋งํ๋ฏ์ด, ๊ทธ๊ฒ์ crate
import ์ ๋์ฌ์ ์ ์๋ํ์ง ์์ผ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๊ฑฐ๊พธ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋๋ผ๊ธฐ ์์ํ์ต๋๋ค. ์ค์ ๋ฌธ์ ๋ ์๋ฅผ ๋ค์ด ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์๊ฐ ์๋ ๊ฒฝ๋ก ๋ช
ํ์ฑ ๋ณ๊ฒฝ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
use crate::utils;
crate
๋ ํน๋ณํ ์๋ฏธ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์ธ์ ๋งคํฌ๋ก ๊ตฌ๋ฌธ์์ ํฐ ์๊ฐ์ ๋ฐ์ ๊ฐ์์ฑ ์์ ์๋ฅผ ์ํ ์ผ์ข ์ ํตํฉ ๊ตฌ๋ฌธ์ ์ฐพ๋ ๋์ ๋ค์์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
use std::io;
use std::path::Path;
use log::info;
use $crate::utils;
crate fn hello() -> io::Result<()> {
utils::rm_rf(Path::new("/"))?;
info!("Goodbye, World!");
}
( self
, super
๋ฐ crate
๊ฒฝ๋ก ๊ฐ์ ธ์ค๊ธฐ์ฉ ํน์ ์ต์ปค์๋ ์ ๋์ฌ๊ฐ ํ์ํฉ๋๋ค(์: $crate
). ๋ณ์์ฒ๋ผ ๋ณด์
๋๋ค)
๋ณต์กํ ์:
crate struct Foo(crate crate::Bar);
๋ฉ๋๋ค:
crate struct Foo(crate $crate::Bar);
์ค๋ณต ์ถ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค: https://github.com/rust-lang/rust/issues/45388.
์ด๊ฒ์ ์ฐฌ์ฑํ์ฌ ๋ซ์ต๋๋ค.
Rustc ๊ตฌํ์ด ์ด ๊ธฐ๋ฅ์ dogfoodํ๋ ์ด์ ๊ฐ ์์ต๋๊น? crate fn
pub(crate) fn
๋ก ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ ๋ถ์์ ํ ๊ธฐ๋ฅ AFAICT์ ๋ํ ์์กด์ ์ค๋จํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ ์ด์ ๊ฐ ์์ต๋๋ค. Clippy์ Rustc๋ ๋ชจ๋ ๋ถ์์ ํ ๊ธฐ๋ฅ์ ํญ์ ์ฌ์ฉํ๋ฉฐ ๊ตฌํ์์ ๋ฒ๊ทธ๋ฅผ ์ก๋ ๊ฒ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํ ๋๋์ ์ป์ ์ ์๋ค๋ ์ ์์ ๋ ๊ด๋ฒ์ํ๊ฒ ํ ์คํธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ Clippy ๋ฐ Rustc์์ ๊ฐ์์ฑ ์์ ์๋ก crate
๋ฅผ ์ฌ์ฉํ๋ฉด pub(crate)
๋ณด๋ค ์ฝ๊ธฐ ์ข๊ณ ์ด ์ถ์ ๋ฌธ์ ์์ ์ธ๊ธ๋ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ -์ค์ ๋ฌธ์ . ๋ด ์๊ฐ์ https://github.com/rust-lang/rust/issues/53120#issuecomment -413466129, https://github.com/rust-lang/rust/issues/53120#issuecomment -414392549, https://github.com/rust-lang/rust/issues/53120#issuecomment -414392549 crate
๊ฐ ์ธ๋ถ์์๋ ์ ์๋ํ๋ค๊ณ ์ ์ํฉ๋๋ค.
์ค์ ๋ก ์ ์๋ ํ๊ธฐ ๋๋ฌธ์ ์ธ์ด ํ์ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ํด ๊ธ์ ์ ์ผ๋ก ์๊ฐํ๊ณ RFC ์น์ธ ๋์๊ธฐ ๋๋ฌธ์ struct Foo ( crate :: foo :: Bar )
๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ํ ๊ฐ์์ฑ ์์ ์๋ก crate
์์ ํ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. struct Foo ( crate :: foo :: Bar )
( ํ์ฌ ๊ฒฝ๋ก๋ก, ์๋ง๋ ๋ง์ ๊ฒ์
๋๋ค ).
FWIW, ๋๋ ํ๋ฌผ-n64 ์์ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋งค์ฐ ์ข์์ต๋๋ค!
๋๋ crate
์ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ๊ทธ ์ด์ ๋ ๊ทธ๊ฒ์ด ์งง๊ณ pub(crate)
์ ๊ฐ์ ๊ดํธ๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋๋ ์ฝ๋ ๋ฐฉ์์ ์ฌ์ ํ โโ๋ง์์ ๋ค์ง ์์ต๋๋ค.
๋ํ 3๊ธ์๊ฐ ์๊ธฐ ๋๋ฌธ์ pub
<-> crate
์ ํจ๊ป ์์์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
๋๋ ์ฌ์ ํ ์์ด๋ฌ๋ํ๊ฒ๋ our
๋ฅผ ์ข์ํ๋ค.
@petrochenkov ๋น์ ์ด ์ด ๊ฒ์ ๋ํ ๋์ ์ดํด๋ ๋น์ ์ด pub(crate)
๋ณด๋ค $ crate
๋ฅผ ์ ํธํ์ง๋ง crate
๋ณด๋ค ๋ ๋์ ๊ฒ์ ์ํ๋ค๋ ๊ฒ์
๋๋ค. ์ ํํ ํ๊ฐ์ธ๊ฐ์?
FWIW, ๋๋ ์ฌ์ ํ intern
๊ฐ ์ข์ ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
pub(crate)
๋ณด๋ค ์งง์( crate
๋ณด๋ค ํ ๋ฌธ์ ๊ธธ์ง๋ง)crate
(๊ฒฝ๋ก์ ๊ฐ์ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ๋จ, ์: crate::foo::bar
)๋ณด๋ค ์ฝ๊ธฐ(IMO)๊ฐ ๋ ์ข์ต๋๋ค.extern
์ ๋์นญ์ด ์ข์ต๋๋ค.internal
). ์ฝํ๋ฆฐ, C# ๋ฑ์ฆ, ๋๋ ๋ํ pub(crate)
๋ก ๋์ฒด๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ ํฉ๋๋ค .
๊ทธ๋ผ ํด๊ฒฐ๋์์ต๋๋ค-- ์ธ ๊ธ์๊ฐ ์ข๊ณ "์ธํด"์ด ์ข์ผ๋ฏ๋ก... int
. ;)
crate ::T
(๊ณต๋ฐฑ ํฌํจ) ์ผ์ด์ค์ ๋ํ ๋ณดํ์ ์ฃผ์๊ฒ ์ต๋๊น?
@Centril ์ฐ๋ฆฌ ์ค ๋ช ๋ช ์ด #rocket ์ ๋ํด ๋ ผ์ํ๊ณ ์์์ต๋๋ค. ์ต๊ทผ ์๊ฒฌ์ ๋ฐ๋ฅด๋ฉด ๊ฐ๊น์ด ์ฅ๋์ FCP๊ฐ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
@jhpratt ๊ธ ์ ์ฐ๊ณ ๊ฒฐ๊ตญ ์ ์ํ๋ ค๊ณ ํ๋๋ฐ ๋ค๋ฅธ ์ผ๋ก ๋ฐ๋นด์ด์. ์กฐ๋ง๊ฐ ์๊ฐ๋ด์ ์ฐพ์๋ด์ผ๊ฒ ์ต๋๋ค.
๊ทธ๋์, ๋๋ ๋จ์ง ๋ฌธ์ ๋ฅผ ํ์ํ๊ณ ๋งคํฌ๋ก์ ๋ํ ๊ฒ์ ์ฐพ๊ณ ์์๊ณ ์ด๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด๋ฏธ ์ค๋ซ๋์ pub(crate)
๋ฅผ ์์ ์ ์ผ๋ก ๋ณด์ ํ๊ณ ์์ผ๋ ์ด ๋ฌธ์ ๋ฅผ ๋ซ์์ผ ํ์ง ์์๊น์?
ํฅ๋ฏธ๋กญ๊ฒ๋ ์ด๊ฒ์ ์ต๊ทผ lang-team ํ์ ์์ ๋ฐฉ๊ธ ์ ๊ธฐ๋์์ผ๋ฉฐ, ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๊ฐ ๋์ด๋ฆฌ๊ณ ์ถ์ ๊ฐ๋ฅํ ๋ฌธ์ ๋ก ๋ ผ์ํ์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋งํ์๋ฉด, ํ๋์ crate fn
๋ฐ crate foo: T
๋ฅผ ์ธ ์ ์๋ค๋ ๊ฒ์ด ํ์คํ ๊ทธ๋ฆฝ์ต๋๋ค. pub(crate)
์ ๊ตฌ๋ฌธ์์ ํฐ ์ฐจ์ด๋ ์์ง๋ง ํนํ ๊ณต๊ฐ ํ๋๊ฐ ๋ง์ ๊ตฌ์กฐ์ฒด์์ ์ฝ๋๋ฅผ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๋ํ ํฉ๋ฆฌ์ ์ด๊ณ ์ ์ฉํ๊ณ ๋จ์ํ๋ "ํ๋ผ์ด๋ฒ์ ๋ชจ๋ธ"์ ๊ธฐ์ฌํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
crate
, ripgrepํด์ผ ํจ)pub
).์ ์๊ฐ์๋ ์ด ํค์๋์ https://github.com/rust-lang/rust/issues/48054 ์ ๊ตฌ์๋ ๋ณ๊ฒฝ ์ฌํญ ์ฌ์ด์ ๊ต์ฐจ์ ์ด ์์ผ๋ฉฐ ํจ๊ป ์ฑํํ๊ณ ์ถ์ต๋๋ค. ๋๋ ์ธ๋ถ ์ฌํญ์ ์์ด ๋ฒ๋ ธ์ง๋ง ์์ ๋ชจ๋ธ์ ์คํํ๋ ค๊ณ ํ ๋ ์ป์ ์์๋ ์ค๋ฅ๊ฐ ์์๋ ๊ฒ์ผ๋ก ๊ธฐ์ตํฉ๋๋ค.
์ด์ ๋ํ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ๋๊ตฐ๊ฐ๊ฐ ์ญ์ฌ๋ฅผ ๋ฌธ์ํํ๊ณ ์ ๊ธฐ๋ ๋ชจ๋ ์ฐ๋ ค ์ฌํญ์ ๊ฐ์กฐ ํ์ํ๋์ง ํ์ธํ๋ ๊ธ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ๊ธฐ์ตํ๋ ํ ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ๋ ๋ค์์ ๊ตฌ๋ฌธ์ ๋ชจํธ์ฑ์ ๋๋ค.
struct Foo(crate ::x)
์ค๋๋ , ์ด๊ฒ์ ํ์ฉ๋๊ณ crate ::x
๋ crate::x
๊ฒฝ๋ก๋ก ๊ตฌ๋ฌธ ๋ถ์๋์ง๋ง ๊ทธ๋ด๋ฏํ๊ฒ ์ฌ์ฉ์๋ $ ::x
๋ฅผ ๊ฒฝ๋ก๋ก ์ฌ์ฉํ์ฌ ๊ฐ์์ฑ ์์ ์ ์ญํ ์ ํ๋๋ก crate
๋ฅผ ์๋ฏธํ์ต๋๋ค. .
๋๋ crate
์์์ด๋ฅผ ๋ค์ ๋์
ํ๊ณ ์์ ๊ฒฝ์ฐ์ ๊ตฌ๋ฌธ ๋ถ์์ ์ค๋๋ ๊ณผ ๊ฐ์ด ์ ์งํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. Rust 2018 ์ดํ๋ก ::foo
๊ฒฝ๋ก๋ ๋๋ถ๋ถ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ฌ์ ํ ์กด์ฌํ๋ฉฐ ๋งคํฌ๋ก์ ๊ฐ์ ํน์ ์ปจํ
์คํธ์์ ์ ์ฉํ ์ ์์ง๋ง ๋๋ถ๋ถ์ ์ฉ์ด๋ ์ด์ crate_name::b
์ฒ๋ผ ๋ณด์ด๋ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๊ถ์ฅํฉ๋๋ค. crate_name
๋ ํค์๋ crate
์ด๊ฑฐ๋ ๋ค๋ฅธ ์์์ ์ด๋ฆ์ผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ crate::x
(๊ณต๋ฐฑ ๋ฌด์)๊ฐ ์ค์ ๋ก ๊ฒฝ๋ก ๋ก ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ ํ์ฌ ๊ตฌ๋ฌธ ๋ถ์์ด ์ ํํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ ์ฌ์ ์ธ ์ฌ์ฉ์ ํผ๋์ ํด๊ฒฐํ๋ ค๋ฉด ๊ณต๋ฐฑ์ ๋ฏผ๊ฐํ ๋ฆฐํธ๊ฐ ํฉ๋ฆฌ์ ์ผ๋ก ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, struct Foo(crate ::x)
๋ ๊ฒฝ๊ณ ํ์ง๋ง struct Foo(crate::x)
๋ ๊ฒฝ๊ณ ํ์ง ์์ง๋ง ๋ ๋ค ํ์ฉ๋๊ณ ๋๋ฑํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ํตํฉ ๊ตฌ๋ฌธ๊ณผ ๋จ์ํ lookahead(1) ํ์๋ฅผ ๋ ์ ํธํฉ๋๋ค. ๋ํ, ํฌ๋ ์ดํธ๋ ํฌ๋ ์ดํธ์ด๊ณ , ๊ฑฐ๊ธฐ์ crates.io ๊ฐ ์์ผ๋ฉฐ, ๊ทธ ๋ชจ๋ ๊ฒ์ ๊ฐ์์ฑ๊ณผ _์ง์ _ ๊ด๋ จ์ด ์์ต๋๋ค โ pub(_)
์ปจํ
์คํธ์์๋ง.
ํ์ง๋ง ๋ด๊ฐ ๋ญ ์์? ๋ ๋ค๋ฅธ ๊ด์ ์ผ ๋ฟ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ ์์ฌํ ์ฌ์ง ์์ด ๋ ๋ง์ ๊ฒฝํ๊ณผ ๋ ๊ฐ์น ์๋ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
@nikomatsakis ์ด ์ฌ์ฉ ์ฌ๋ก์ ๋ํด intern
์ ๋ํ ์๊ฐ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค(๋๋ ์ด ์์ ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ ํค์๋๋ฅผ ์์ฝํ๊ณ ์์ต๋๊น?).
๋ช ๋
์ด ์ง๋ ํ์๋ ๋ด ๋๋์ ์ฌ์ ํ โโ๊ฐ์ต๋๋ค. ๊ฐ๋
์ฑ์ ์ํด ์ต์ ํํฉ๋๋ค . ์ฝ๋๋ฅผ ์์ฑ ํ๋ ๊ฒ๋ณด๋ค ์ฝ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ง๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๋์ ์ ์๊ฐ์๋ pub(scope)
, pub
, pub(crate)
, pub(super)
, pub(in proto::h1)
๋ฅผ ์ฝ๋ ๊ฒ์ด ๋ ๋ช
ํํฉ๋๋ค. .
๊ทธ๋ฌ๋ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฌํ ์๊ฒฌ๊ณผ ๋ํํ๋ ๋ฐ ์ค์ ๋ก ์๋ก์ด ๊ฒ์ ์ถ๊ฐํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ฒฐ์ ์ ์๋ก์ด ๊ฒ์ ๊ทผ๊ฑฐํด์ผ ํฉ๋๊น? ๋๋ ๋ฌ๋ฆฌ ๋งํ๋ฉด, ์ด ๊ตฌ๋ฌธ์ ์ฑํํ๊ธฐ๋ก ํ ๊ฒฐ์ ์ด ๋ช ๋ ์ ์ ์๋์ ๋๋ ์ฐ๊ธฐ๋์์ ๋ ์๊ฐ ๋์ด์ผ ํ๋ค๊ณ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๋ํ ํฉ๋ฆฌ์ ์ด๊ณ ์ ์ฉํ๊ณ ๋จ์ํ๋ "ํ๋ผ์ด๋ฒ์ ๋ชจ๋ธ"์ ๊ธฐ์ฌํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
- ๊ตฌ์กฐ์ฒด, ํ๋๋ ๋ชจ๋ ์ ๋ํด ๋ก์ปฌ์ ๋๋ค(๋งค์ฐ ์ข์ ์ถ๋ก ).
- ๋๋ ํ์ฌ ํฌ๋ ์ดํธ ๋ด์ ์ด๋๊ฐ์์ ์ฌ์ฉ๋ฉ๋๋ค(
crate
, ripgrepํด์ผ ํจ)- ๋๋ ์ ์ธ๊ณ์ ๊ณต๊ฐ๋ฉ๋๋ค(
pub
).
๋๋ ์ด ๋จ์ํ์ ์ด์ ๊ณผ ํํ๋ ฅ์ ์์คํ ๊ฐ์น๊ฐ ์๋ ๋ฐฉ๋ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๊ฐ์น ์๋ ์ผ์ ์ํด ๋๋ ์ข ์ข ์์ดํ ์ ๋ถ๋ชจ ๋ชจ๋์ ๊ณต๊ฐํ์ง๋ง(ํ์ ๋ชจ๋์ด ์ฌ์ฉํ ์ ์๋๋ก) ์ ์ฒด ํฌ๋ ์ดํธ๊ฐ ์๋ ํญ๋ชฉ์ ๊ณต๊ฐํฉ๋๋ค. ์กฐ๋ถ๋ชจ ๋ชจ๋์ ๊ณต๊ฐ๋ ๋ํ์ง๋ง ์ฌ์ ํ ๊ฐ๋ ์์ต๋๋ค.
pub(super)
์ ์ฌ์ฉ์ ์ค๋จํ๋ ๊ฒ์ ์๋นํ ์์ค์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด์๋ ๋ณ๋๋ก crate
๋ช
์ฌ ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ ํญ๋ชฉ์ ์์ํ๋ ํ์ ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ํฅ๋ถํ์ง ์์ต๋๋ค. ๋น๊ต๋ฅผ ์ํด: pub(lic), unsafe, const(ant)๋ ํ์ฉ์ฌ์
๋๋ค. ํญ๋ชฉ ์ ์์์ ์ด๋ฏธ ํค์๋๋ก ์ฌ์ฉ๋ ๋ช
์ฌ๋ ํ์ ์๊ฐ ์๋๋ผ ํด๋น ํญ๋ชฉ์ ํน์ฑ์ ๋ํ๋
๋๋ค: ๊ธฐ๋ฅ, ํน์ฑ, ๋ชจ๋, โฆ
์์๋ ์ด๋ฏธ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๋ ๊ฐ๋
์ด์ง๋ง ์ด ์ ์์์ crate
๋ก ์์ํ๋ ํญ๋ชฉ ์ ์๋ ์ ์์๋ฅผ ์ ์ํ์ง ์์ต๋๋ค.
์ฝ๊ฐ์ ์๋ก์ด ์ ๋ณด:
Rust-analyzer๋ pub(crate)
์ถ๊ฐ์ ๋ํ ์์ฑ ๊ธฐ๋ฅ๊ณผ ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ (์ฃผ๊ด์ ์ผ๋ก) ์ธ ๋ฒ์ ํค ์
๋ ฅ์ผ๋ก ์
๋ ฅํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ฑ๊ฐ์๊ฒ ๋ง๋ญ๋๋ค.
์ฌ๊ธฐ์ ์๋ก์ด ์ ๋ณด๊ฐ ๊ฑฐ์ ์ถ๊ฐ๋์ง ์๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ์์ ์นํธํ๊ณ ์ถ๋ค๋ฉด, ์ข์ ๋ค์ ๋จ๊ณ๋ ๋์๊ฐ์ ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๋ฅผ ์์ฝํ๊ณ ์ด๋ฅผ lang ํ์ด ์๋ํ๊ณ ์ต์ข ๊ฒฐ์ ์ ๋๋ฌํ๊ธฐ ์ ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ํ์คํ ์ด ์ ์์ ์๋ฝํ๊ฑฐ๋ ๊ฑฐ๋ถํ๋ ๊ฒ์ ์ ํธํ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ์ ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ์ดํด ๋ณด๋ @nikomatsakis ์ ์ต๊ทผ ๋๊ธ ์ด ๋ชจ๋ ๊ฒ์ ์ ์์ฝํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. intern
์ ๊ฐ์ ๊ฒ์ ์ฌ์ ํ ์ง์ํ๋ ์์์ ์ฌ๋๋ค์ ์ ์ธํ๊ณ ๋ crate
๊ฐ ๊ฐ์ฅ ๋
ผ๋ฆฌ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค( RFC 2126 ์์ ํ์ฉ๋จ). ์ ์ผํ๊ฒ ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๋ fn foo(crate ::bar)
๊ตฌ๋ฌธ ๋ถ์ ๋ฐฉ๋ฒ์
๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฝ๊ณ ํ๋ ๊ณต๋ฐฑ์ ๋ฏผ๊ฐํ ๋ณดํธ๋ผ๊ธฐ๊ฐ ์์ํ๊ธฐ์ ๊ฐ์ฅ ๋
ผ๋ฆฌ์ ์ธ ์์น์ธ ๊ฒ ๊ฐ์ต๋๋ค. crate ::bar
๋ ํ์ฌ ๊ฒฝ๋ก๋ก ๊ตฌ๋ฌธ ๋ถ์๋๋ฉฐ Rust 2015์ 2018 ๋ชจ๋์์ ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋์
์ ์ฃผ์ ๋ณ๊ฒฝ ํ๋ณด๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
crate ::bar
์ฌ๋ก๋ ์ค์ ๋ก๋ ์ ํ ์ค์ํ์ง ์์ผ๋ฉฐ ์ด๋ฏธ ๋๋จธ์ง ์ธ์ด์ ์ผ๊ด๋๊ฒ ๋์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ง์์ ์ผ๋ก ํ ๋ก ์ ๋นจ๊ฐ ์ฒญ์ด์์ต๋๋ค, ์ ๋ฐ ๊ด์ฌ์ ์ง์คํ์ง ๋ง์ญ์์ค.
๋๋ ํ์คํ ์ด ์ ์์ ์๋ฝํ๊ฑฐ๋ ๊ฑฐ๋ถํ๋ ๊ฒ์ ์ ํธํ ๊ฒ์ ๋๋ค.
๋๋ ๊ฑฐ๋ถ์ ํฌํํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ Rustc์์ pub(crate)
crate
๋ฅผ ์ง์์ ์ผ๋ก ์ฌ์ฉํด ์์ผ๋ฉฐ ๋ ์งง์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ํนํ ํ๋ ๋๋ ์์
ํ์์ ์ด์ธ๋ฆฌ์ง ์๊ณ crate
์ค์์ ์ ํํฉ๋๋ค. pub(crate)
๋ ๋ ๊ฐ์ง ์
์ค ์ด๋ ๊ฒ์ด ๋ ์์์ง ํ์คํ์ง ์์ ์ํ์์ ๋ ์ค ํ๋๋ฅผ ์ ํํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
์. ๋ ์ค์ํ ๊ฒ์ @SimonSapin ์ด crate bar
๊ฐ ์ค์ ๋ก ์ ํฌ๋ ์ดํธ๋ฅผ ์ ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ์ ํฌ๋ ์ดํธ๋ฅผ ์ ์ํ์ง ์๋๋ค๊ณ ์ธ๊ธํ ๊ฒ์
๋๋ค.
@petrochenkov ๋ณดํธ๋ผ๊ธฐ๊ฐ ๋ง์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํ์ญ๋๊น? ๊ฐ์ธ์ ์ผ๋ก ์ด ํ ๋ก ์ ๋ณด์ง ์๊ณ crate ::bar
๋ฅผ ๋ณด์๋ค๋ฉด pub(crate) ::bar
์ฒ๋ผ ์๋ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๊ฒฝ๋ก์ ๊ณต๋ฐฑ์ ํ์ฉํ๋ ๊ฒ์ _์ ํ_ ํผ๋์ค๋ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@jhpratt ํ์๊ฐ ํ ํฐ์ผ๋ก ์๋ํ๋ ๋ฐฉ์์ ํน์ฑ์ผ๋ก ์ธํด ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ ์ฌ์ด์ ๊ณต๋ฐฑ์ ๊ฑฐ๋ถํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ๋ํ quote!, syn ๋ฐ ๊ธฐํ ์ฌ๋ฌ ๋๊ตฌ์ ๊ฐ์ ์์ฒญ๋ ์์ ๋๊ตฌ๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ซ๋ ๊ฒ๋ ์ง์งํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋๋ ๊ฐ๊ฒฐํจ์ ์ป๋ ๊ฒ์ด ๊ฐ๋ ์ฑ์ ๋ํ ์ ์ฌ์ ์ธ ์์ค์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์๋ ์ด ๊ตฌ์ฑ์ ์๋ฏธ์ ๋ํด ํํ๋ ํผ๋์ ์ถฉ๋ถํ ๋ณด์์ต๋๋ค.
์ด๊ฒ์ "๋ ํฐ"(๊ทธ๋ฌ๋ ๋ซํ) ์ถ์ ๋ฌธ์ #44660์ ๋ ์ ๋ง์ ์ ์์ง๋ง ๊ฐ์์ฑ ์์ ์์ ์ง์ ๊ด๋ จ์ด ์์ผ๋ฉฐ #44660์ ๋ค๋ฅธ ํ์ ๋ฌธ์ ์๋ ๋ง์ง ์์ต๋๋ค.
์ด๋ค ์์ ์์ ๋๊ตฐ๊ฐ pub(in path)
pub(crate)
๋ฐ pub(super)
๋ฅผ ํฌํจํ์ฌ ์ด์ pub(path)
๊ฐ ํฉ๋ฒ์ ์ผ ์ ์๋ค๊ณ ์ ์ํ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ์ด๋ pub(...)
์ ๋ฉ์ง ๋จ์ํ์ธ ๊ฒ ๊ฐ์ต๋๋ค. crate
์ ๋ค๋ฅธ ๋ฐฉํฅ์ด์ง๋ง ์ฐ๋ฆฌ๋ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
ํธ์ง : ์ค์ ๋ก ์ด๊ฒ์ด ์๋ํ๋์ง ํ์คํ์ง ์์ต๋๋ค ... struct S(pub(path) Type)
๋ struct S(pub (Type,))
์ ๊ฐ์ ๊ฒ์ผ๋ก (LL-esque ๊ตฌ๋ฌธ ๋ถ์์) ๋ชจํธํฉ๋๋ค.
๊ทธ๋์ ๋๋ ์ง๋ ๋ช ๋ฌ ๋์ ์ด ์๊ฐ์ ํด์๋ค. "๋ซ๊ธฐ" ์์น์ ๋ค๋ค๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ ์ฅ์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
pub(super)
, ํนํ ๋ ๊ฐ ์ด์์ ์์ค(์: pub(crate::foo)
)์ด ํ์ํ ๊ฒฝ์ฐ๋ ๋๋ฌผ์ง๋ง ์ค์ ๋ก๋ ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ข
์ข
ํ์ ๋ชจ๋์ด ์๋ ๋ชจ๋์ ์ํ๋๋ฐ ์ด๋ฌํ ์ธ๋ถ ์ฌํญ์ ๋ํด ์์ ๊ฐ์์ฑ์ ์ฌ์ฉํ๋ฉด ์๋ํ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ์์ค์ ์ ๋ฌํ๋ ๋ฐ ์คํจํฉ๋๋ค.pub(crate) fn
๋ crate fn
๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๊ฒฐํ์ง๋ง ๊ทธ๋ ๊ฒ ๋์์ง๋ ์์ต๋๋ค. pub(crate)
๊ฐ pub(crate::foo)
$ ๋ก ํ์ฅ๋๋ ๊ฒ์ด ๊ท์ฝ์ต๋๋ค. ์ด๋ ์ ๊ฐ ๊ฐ๋ ๋ฐ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก(์: ํฌ๋ ์ดํธ ๋ด์ "ํฐ" ๋ชจ๋)๋ฅผ ํฌํจํ์ง๋ง ๋๋ฌด ์ฅํฉํฉ๋๋ค. ๊ทธ ํฐ ๋ชจ๋์ด ์ด์จ๋ ํ์ ์์์ ํฌํจ๋๋ ๊ฒ์ด ๋ ๋์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค...pub(x) fn
์ ๋ํ๋๋ ๋ชจ๋ ์ ํ์ด ์ ์ ํ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ฅผ ๋ณด์ฅํ๋๋ก ํ๋ ค๋ ๋ณดํธ๋ผ๊ธฐ์ ์ค๋ฅ์์ ๋น๋กฏ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ๊ท์น์ ์์ ํ๊ณ ๋ ์ด์ ๊ทธ๋ฐ ์ฑ๊ฐ์ ์ผ์ ๊ฒช์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฌํ ์ฑ๊ฐ์ ์ผ์ด ๋ ๋ง์ด ๋ฐ์ํ๋ฉด ์ฐ๋ฆฌ๋ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.pub
๋ฅผ ์์ฑํ์ฌ "๊ตฌ์กฐ์ฒด ์์ฒด๋งํผ ๊ณต๊ฐ"๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ ์๊ฐ์๋ ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ์ง๊ธ crate fn
์ ์ถ๊ฐํ์ง ์๋๋ค๊ณ ํด์ ๋์ค์ ์ถ๊ฐํ ์ ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ํนํ, ๋ค๋ฅธ ํฌ๋ ์ดํธ ๋ด์์ "๊ฐ๋ฒผ์ด ์ธ๋ผ์ธ ํฌ๋ ์ดํธ"๋ฅผ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด "ํ๋ผ์ด๋ฒ์ ์์ค 3๋จ๊ณ" ๋ชจ๋ธ์ด ๋ ์ ์๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ํฌ๋ ์ดํธ ๋ด์ ํ์ ๋ชจ๋์ ๊ฐ๋ ๋์ ์์ํ๋ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋ ์ ์ฉ ํฌ๋ ์ดํธ ๋ฅผ ์ ์ธํ ์ ์๋ค๋ฉด(๊ฐ์ฅ ํนํ, ์๋ง๋ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ํ DAG์ ๊ฐ์ ๊ด๊ณ์ผ ๊ฒ์
๋๋ค). ๊ฒฝ๋ ์ธ๋ผ์ธ ํฌ๋ ์ดํธ๊ฐ ์ค์ ๋ก ์๋ํ๋์ง ํ์คํ์ง ์์ง๋ง pub(super)
์ ๊ฐ์ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ฎ๊ณ ๋์ฒดํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ํ๊ตฌํ๋ค๋ฉด crate fn
์ ๋ํ ํ ๋ก ์ ๋ค์ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํจ์ฌ ๋ ์ ์ฉํ๊ณ ์ผ๋ฐํ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ปจ๋, ์ปดํ์ผ๋ฌ์์ crate
๊ฐ์์ฑ ์์ค์ ์ ๊ฑฐํ๊ณ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์ธ์ ์์ ํ๋ ์ ์๋์ง ํ์ธํ๊ณ ์ถ์๊ณ ์ ๊ฑฐํ ๊ณํ์ด ์๋ค๋ ์ฌ์ค์ ๋๋๊ณ ์ค๋ง์ค๋ฝ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ถ๊ฐ๋ ์ง ์ผ๋ง ๋์ง ์์ ๊ทธ๊ฒ์ ์ผ์์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์์์ ๋
ผ์ํ ๋ฌธ์ ์ ๋ํด ๊ฑฐ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด crate ::path
์ ์ ์ฌํ ๊ฒ์ ์์ง ์์ฑํ์ง ์์์ผ๋ฉฐ ::path
๊ตฌ๋ฌธ์ ๋ง์ง ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์๋ง ์ ๋ ์์ฑํ์ง ์์ ๊ฒ์
๋๋ค.
๋ฌผ๋ก ๊ฐ์ ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ํค์๋๋ฅผ ์ ํํ๋ ๊ฒ์ด ๋ ์ข์ ์ ์์ต๋๋ค. pub(super)
๋ ์ฌ์ ํ ๋ถํธํ๊ณ ๋์ฐ๋ฏธ ๋ฉ์๋์ ๋ํด ํฌ๋ ์ดํธ ์์ค ๊ฐ์์ฑ์ ์ฌ์ฉํ ๋ ์ฌ๋ฐฉ์์ ๋ฐ๋ ์ฝ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๋ ๊ฒ์ ์ฑ๊ฐ์ ์ผ์
๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๋ก์ ๋ ๋์ ์๋ฃจ์
์ ์ฐพ์ ๋๊น์ง ์ด ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๋๋ ๊ฒ์ด ์ข์ต๋๋ค(๊ธฐ๋ฅ ์ ํ). pub(crate)
๊ตฌ๋ฌธ์ ๋์ ๊ฑฐ์ฌ๋ฆฌ๊ณ ํฐ ๋ชจ๋์ ๋ ์๊ณ ์ด์ดํ ๋ชจ๋๋ก ๋๋๋ ๊ฒ์ ์ฝ๊ฐ ๊ถ์ฅํฉ๋๋ค.
"ํผํฉ๋ ์์ค์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ"์ ๊ด๋ จ๋ ๊ฐ์ฅ ํฐ ์ธ์ฒด ๊ณตํ์ ์ฅ์ ๋ฌผ์ (์๋ฅผ ๋ค์ด) pub(x) fn์ ๋ํ๋๋ ๋ชจ๋ ์ ํ์ด ์ ์ ํ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ฅผ ์ ์งํ๋๋ก ํ๋ ค๋ ๋ณดํธ๋ผ๊ธฐ์ ์ค๋ฅ์์ ๋น๋กฏ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ "unreachable pub" ๋ฆฐํธ( mod private { pub fn f() {} }
)๋ ํ์ฑํํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
ํ, ์ฌ๋ฌ๊ฐ์ง Rustc ์ฝ๋๋ฅผ ์ฝ๊ณ crate
๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ณด๋ฉด์ ๊ณฐ๊ณฐ์ด ์๊ฐํด ๋ณด์๋๋ฐ, ๊ทธ๋ฐ ๊ฒฝ์ฐ๋ค์ด ๋ชจ๋ pub(crate)
... ํด๋ณผ ๋งํ ๊ฐ์น๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค. diff๊ฐ ๋๋ฅผ ์ด๋ป๊ฒ ๋๋ผ๋์ง ํ์ธํ๊ธฐ ์ํด ์คํ์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ผ๊ฐ์์ ๋ง๊ตฌ๊ฐ์ผ๋ก ๊ทธ๊ฒ์ ์ฎ๊ฒผ์ ๋ ๋ถํ์ ๋ํด ์ฌํ๋ ๊ธฐ์ต์ด ๋ฉ๋๋ค. ํ์ง๋ง ์ง๊ธ์ ๊ทธ๊ฒ์ ์ต์ํด์ ธ์ ๊ทธ๋ ๊ฒ ๋ง์ด ๊ท์ฐฎ๊ฒ ํ์ง๋ ์์์ต๋๋ค.
@matklad ๋๋ ๊ทธ๋ ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ณดํธ๋ผ๊ธฐ๋ ๊ฝค ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์งํ ๋งํด์, ๋๋ ์ ๋ด๊ฐ ์์ ์ ๊ฒช์๋ ๊ฒ๊ณผ ๊ฐ์ ์ข
๋ฅ์ ์ค๋ฅ์ ์ฑ๊ฐ์ฌ์ ์ง๋ฉดํ์ง ์์๋์ง ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค. ์ต๊ทผ์ Rust ์ฝ๋๋ฅผ ์ถฉ๋ถํ ์์ฑํ์ง ์์์ ์๋ ์์ต๋๋ค! ๋ด๊ฐ ์ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ pub
๋ง๋๋ ๊ฒ ์ธ์๋ ์ปดํ์ผ๋ฌ๋ฅผ ๋ง์กฑ์ํฌ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ง์ฆ๋๋ ์ฃผ๊ธฐ๊ฐ ์์๋ค๋ ๊ฒ์ ํ์คํ ๊ธฐ์ตํฉ๋๋ค.
pub(crate)
๋ฅผ ์ ์งํ๊ณ ๋ณ์นญ pubc
์ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ด๊ฒ์ ๋งค์ฐ ์ ์ฌํ๊ฒ ์ฝ๊ณ ํ์ฌ ์ฝ๋๋ฅผ ์์์ํค์ง ์์ผ๋ฉฐ ๊ดํธ๋ฅผ ์
๋ ฅํ ํ์๊ฐ ์์ต๋๋ค(์ข ๋ ๋นจ๋ผ์ง).
์ด๊ฒ์ ๋ํ ๋ถ๋ชจ์์ ๊ฐ์์ฑ์ ์ํด pubs
๋ฅผ ํ์ฉํฉ๋๋ค.
์์ปจ๋ ์ ๋ ์ปดํ์ผ๋ฌ์์
crate
๊ฐ์์ฑ ์์ค์ ์ ๊ฑฐํ๊ณ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค.
์ฝ๋๋ฅผ ์ฝ์ ๋ pub(crate)
๊ฐ ๋์ ๊ฑฐ์ฌ๋ฆฌ๊ณ ์๋๋ฝ์ต๋๋ค. ๋์ crate
๊ฐ์์ฑ ์์ ์๊ฐ ์์ผ๋ฉด ์ ๋ง ์ข์ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ์ง๊ธ
crate fn
์ ์ถ๊ฐํ์ง ์๋๋ค๊ณ ํด์ ๋์ค์ ์ถ๊ฐํ ์ ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ํนํ, ๋ค๋ฅธ ํฌ๋ ์ดํธ ๋ด์์ "๊ฐ๋ฒผ์ด ์ธ๋ผ์ธ ํฌ๋ ์ดํธ"๋ฅผ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด "ํ๋ผ์ด๋ฒ์ ์์ค 3๋จ๊ณ" ๋ชจ๋ธ์ด ๋ ์ ์๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ํฌ๋ ์ดํธ ๋ด์ ํ์ ๋ชจ๋์ด ์๋ ๋์ ์์ํ๋ ๋ชจ๋ ๊ฒ์ ํฌํจํ๋ private _crate_๋ฅผ ์ ์ธํ ์ ์๋ค๋ฉด(๊ฐ์ฅ ์ฃผ๋ชฉํ ๋งํ ๊ฒ์ ์๋ง๋ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ํ DAG์ ๊ฐ์ ๊ด๊ณ์ผ ๊ฒ์ ๋๋ค). ๊ฒฝ๋ ์ธ๋ผ์ธ ํฌ๋ ์ดํธ๊ฐ ์ค์ ๋ก ์๋ํ๋์ง ํ์คํ์ง ์์ง๋งpub(super)
์ ๊ฐ์ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ฎ๊ณ ๋์ฒดํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ํ๊ตฌํ๋ค๋ฉด crate fn ์ ๋ํ ํ ๋ก ์ ๋ค์ ์ฌ๋ ๊ฒ์ ๊ณ ๋ คํ ๊ฒ์ ๋๋คcrate fn
ํจ์ฌ ๋ ์ ์ฉํ๊ณ ์ผ๋ฐํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ๋น์ ์ด ์ธ๊ธํ ์ด "๊ฒฝ๋" ์์๋ฅผ ํ์คํ ์ํฉ๋๋ค! ์ฝ๊ฐ ๋ฌด๊ฑฐ์ด ์์ ๊ณต๊ฐ์ผ๋ก ์ฆ์ ์ด๋ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ ๊ฐ์ธ์ ์ผ๋ก
pub(crate)
์ ์ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋๋ ๋งค์ฐ ๋ช ์์ ์ ๋๋ค.@johnthagen ์ด ์ ๊ณตํ ์์ ๋ ๋ณด๊ธฐ์ ์ ๋ง ๊ณ ํต์ค๋ฝ์ต๋๋ค(
crate
์ฌ์ฉ):crate mod color;
๋ ํนํ ํผ๋์ค๋ฌ์ ๋ณด์ ๋๋ค. ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์๊ฐํด๋ด์ผ ํฉ๋๋ค.