Rust: (๋ชจ๋“ˆ) ๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž๋กœ 'ํฌ๋ ˆ์ดํŠธ'์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ

์— ๋งŒ๋“  2018๋…„ 08์›” 06์ผ  ยท  91์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ด๊ฒƒ์€ RFC "๊ฒฝ๋กœ ๋ฐ ๊ฐ€์‹œ์„ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ  ๊ฐ„์†Œํ™”"(rust-lang/rfcs#2126)์— ๋Œ€ํ•œ ํ•˜์œ„ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž๋กœ crate ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ:

  • [ ] struct Foo(crate ::bar) ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๊นŒ?
A-visibility B-RFC-approved B-RFC-implemented B-unstable C-tracking-issue T-lang

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ 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; ๋Š” ํŠนํžˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  91 ๋Œ“๊ธ€

๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž๋กœ 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! ์™€ ๊ฐ™์ด ์„ธ์ƒ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋” ๋น„๋ช…์„ ์ง€๋ฅด๋Š” ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ „์— ์ œ๊ธฐ๋˜์—ˆ์ง€๋งŒ ๋‚ด๊ฐ€ ๋ณด๋Š” ๊ทผ๋ณธ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. crate ๋Š” ๋ช…์‚ฌ ์ž…๋‹ˆ๋‹ค. pub(crate) ๊ฐ€ ๊ธธ๊ณ  ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฌด์–ธ๊ฐ€ ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์ „์ ์œผ๋กœ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๊ณต๊ฐœ ํ˜•์šฉ์‚ฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋” ์ž˜ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. 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) ์•„์ด๋””์–ด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ๊ธฐ๊ณ„์— ์ ํ•ฉ
  • imo๋Š” pub ๋ฅผ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ pub(<something>) ์˜ ์ง€๋ฆ„๊ธธ๋กœ ๋งŒ๋“ค์–ด ๊ธฐ์กด ๊ธฐ๊ณ„๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต๊ฐœ API๊ฐ€ ๋น„๊ณต๊ฐœ API๋ณด๋‹ค ํ›จ์”ฌ ์ž‘์€ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ์— ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ public ๊ฐ€ ๊ณต๊ฐœ API์— ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ํ˜ผ๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RE ์บก์Šํ™”์— ๋Œ€ํ•œ ์˜ํ–ฅ

๊ธฐ์กด pub ์‹œ์Šคํ…œ์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ์บก์Šํ™”์ž…๋‹ˆ๋‹ค. ์‰ฌ์šด ๊ฒฝ๋กœ๋Š” API๋ฅผ ํ•œ ๋‹จ๊ณ„ ์œ„๋กœ๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ๋ ˆ์ดํŠธ์˜ ์ผ๋ถ€์—๋Š” ๊ณต๊ฐœํ•˜์ง€๋งŒ ์ „์ฒด ์ƒ์„ฑ์—๋Š” ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

pub(super) pub(crate) ๋Œ€ํ•œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์ด API๋ฅผ ์บก์Šํ™”ํ•˜์ง€ ์•Š๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ž‘์€ ์ƒ์ž์˜ ๋ฌธํ™” ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ๊ณ ๋ คํ•  ๋•Œ pub(extern) ์— ๋Œ€ํ•œ ์œ„์˜ ์˜๊ฒฌ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฐ˜๋ณต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • pub ๋Š” pub(super) ์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • pub(extern) ๋Š” ๊ณต๊ฐœ API์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์ „์— ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์šฐ๋ ค๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋“ค๊ณผ ๋” ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ ์–ธ์–ด์—์„œ public ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ถ€ ์–ธ์–ด๋Š” ๊ณต๊ฐœ API์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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๊ฐ€ ์ฒ˜์Œ์ด๊ฑฐ๋‚˜ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ€์žฅ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. intern (๋˜๋Š” ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ์ƒˆ ํ‚ค์›Œ๋“œ)
  2. crate
  3. pub(crate)

ํ•ต์‹ฌ ํŒ€์ด intern ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ๊ถ๊ทน์ ์œผ๋กœ ๊ฒฐ์ฝ” ๋ฐ›์•„๋“ค์—ฌ์ง€์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™๋‹ค๋ฉด pub(crate) ์— ๋น„ํ•ด ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— crate ๋’ค์ฒ˜์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @Centril ๊ณผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ถ„๋ช…ํžˆ ๋ฐํžŒ ์ด์œ .

๋”ฐ๋ผ์„œ ํ›จ์”ฌ ๋” ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ํ•ต์‹ฌ ํŒ€์ด ์ด๊ฒƒ์ด ์ตœ์„ ์˜ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ณ ๋ คํ•  ๋งŒํ•œ ์•„์ด๋””์–ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ‘ ๋…น!

@ralfbiedert

์ฒ˜์Œ์—๋Š” (์‹œ๊ฐ์ ) ๋ชจํ˜ธํ•จ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‘๋ ค์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ฒŒ๋Š” ์ •๋ฐ˜๋Œ€์˜ ์ผ์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ƒ์ž๋ฅผ ๋ณด๋ฉด ๊ทธ๊ฒƒ์ด "์ƒ์ž ๋ฌผ๊ฑด"์ด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋“  ๊ฐ€์‹œ์„ฑ์„ ์„ ์–ธํ•˜๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. ์••๋„์  ๋‹ค์ˆ˜์˜ ๊ฒฝ์šฐ์— ์ •ํ™•ํžˆ ๋ฌด์—‡์€ ๋ฌธ๋งฅ์—์„œ ๋งค์šฐ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค(์˜์–ด์˜ ๋ชจํ˜ธ์„ฑ ๊ฐ™์€ ๊ฒƒ).

@zesterer

์ด๋ฏธ ์‚ฌ์šฉ๋œ ํ‚ค์›Œ๋“œ(์˜ˆ: crate)๊ฐ€ ์˜๋ฏธ๋ฅผ ํ†ตํ•ฉํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋‹จ์–ด ์ž์ฒด๋ณด๋‹ค ๋ฌธ๋งฅ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‘๋‡Œ๋Š” ์ปจํ…์ŠคํŠธ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ for in for x in y์™€ impl X for Y์˜ ์˜๋ฏธ๋ก ์  ์˜๋ฏธ๋ฅผ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‘ ๋ถ„์„ ๋ถ€๋ฅด๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ ํ›„ ๋ณ€ํ™”์— ์ฐฌ์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ชจ๋ฒ”์ด ๋˜์‹ญ์‹œ์˜ค.

๋ณด๊ธฐ์—๋Š” ์ด์ƒํ•ด ๋ณด์ด์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๊ฑฑ์ •์€ ๋…น์Šฌ์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์ž…๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์ด ๋…น์„ ํ‰๊ฐ€ํ•  ๋•Œ ๋ˆ„๊ตฐ๊ฐ€์˜ ์˜๊ฒฌ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•œ ๊ฐ€์ง€ ๊ตฌ๋ฌธ์ƒ์˜ ๋ฌธ์ œ๋Š” ๊ทธ๋“ค์„ ์„ค๋“ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜์ง€๋งŒ ํ‰์ƒ๊ณผ ๋‹ค๋ฅธ "์ด์ƒํ•œ" ๊ฒƒ์œผ๋กœ ์Œ“์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์„ ๋‚™๋‹ด์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .
  • ์ด๊ฒƒ์ด Rust๋ฅผ ๋ฐฐ์šฐ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋‚˜์š”?
  • ์ด๊ฒƒ์€ Rust๋ฅผ ๋ชจ๋ฅด์ง€๋งŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ?

์ด๋Ÿฌํ•œ ์šฐ๋ ค๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋” ์ž˜ ์•Œ๊ธฐ ์œ„ํ•ด ์ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์„ฑ ์—ฐ๊ตฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

@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;

๋‹ค์Œ์„ ์ƒ๊ฐํ•˜๋ฉด ์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • "public"์„ "์ „ ์„ธ๊ณ„์— ๊ณต๊ฐœ"๋กœ
  • "private" as "private to the crate"
  • "๊ธฐ๋ณธ์ ์œผ๋กœ ์ „ํ˜€ ๋ณด์ด์ง€ ์•Š์Œ"์œผ๋กœ "๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž ์—†์Œ"

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ priv ๊ฐ€ ๊ฐ€์žฅ ์ œํ•œ์ ์ธ ๊ฒƒ์ด ์•„๋‹Œ ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด๋ฆŽ์„ ๊ฟ‡๋Š” ๋ฐ˜์‘์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ์š”์ ์„ ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. Rust์—์„œ ๋ชจ๋“ˆ์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•„๋ž˜์— ์žˆ๋Š” ๊ฒƒ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด ํฌ๋ ˆ์ดํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ๋ ˆ์ดํŠธ๊ฐ€ "API ๋‹จ์œ„"์ธ ๊ฒฝ์šฐ ๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž๊ฐ€ ์ฃผ๋กœ ํฌ๋ ˆ์ดํŠธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

  2. 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) ์™€ ์œ ์‚ฌํ•œ ์„ ๋ก€๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. crate ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž ๋ชจ๋‘์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. crate ํ‚ค์›Œ๋“œ๋Š” pub(...) ์™€ ๊ฐ™์€ ํ†ตํ•ฉ ๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž ๊ตฌ๋ฌธ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ผ๋ถ€๋Š” 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 ๊ตฌ๋ฌธ ๋ถ„์„์—) ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ด ์ƒ๊ฐ์„ ํ•ด์™”๋‹ค. "๋‹ซ๊ธฐ" ์œ„์น˜์— ๋‹ค๋‹ค๋ž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ž…์žฅ์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • "3๊ฐ€์ง€ ์ˆ˜์ค€์˜ ๊ฐ€์‹œ์„ฑ"(๋ชจ๋“ˆ, ์ƒ์ž, ์„ธ๊ณ„)์ด๋ผ๋Š” ์•„์ด๋””์–ด๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ณ  ๋งค๋ ฅ์ ์ด์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 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 ํ›จ์”ฌ ๋” ์œ ์šฉํ•˜๊ณ  ์ผ๋ฐ˜ํ™”๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ ์ด "๊ฒฝ๋Ÿ‰" ์ƒ์ž๋ฅผ ํ™•์‹คํžˆ ์›ํ•ฉ๋‹ˆ๋‹ค! ์•ฝ๊ฐ„ ๋ฌด๊ฑฐ์šด ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ์ฆ‰์‹œ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰