9.1 Visibility

기본적으로, 모듈의 아이템들은 private의 가시성을 갖고, 이는 pub 수정자로 재정의 될 수 있다. 오직 public 아이템이 외부의 모듈의 영역에서도 접근될 수 있다.

// `my` 모듈
mod my {
    // 모듈의 아이템은 기본적으로 private의 가시성을 갖는다.
    fn private_function() {
        println!("called `my::private_function()`");
    }

    // `pub` 지시어를 통해 기본 가시성을 재정의 한다.
    pub fn function() {
        println!("called `my::function()`");
    }

    // 동일 모듈의 아이템은 다른 아이템이 private여도 접근할 수 있다.
    pub fn indirect_access() {
        print!("called `my::indirect_access()`, that\n> ");
        private_function();
    }

    // 모듈은 중첩 될 수 있다. 
    pub mod nested {
        pub fn function() {
            println!("called `my::nested::function()`");
        }

        #[allow(dead_code)]
        fn private_function() {
            println!("called `my::nested::private_function()`");
        }
    }

    // 중첩 모듈도 동일한 가시성 규칙을 적용받는다.
    mod private_nested {
        #[allow(dead_code)]
        pub fn function() {
            println!("called `my::private_nested::function()`");
        }
    }
}

fn function() {
    println!("called `function()`");
}

fn main() {
    // 모듈은 동일 이름을 가진 아이템 간에 모호성을 허용한다.
    function();
    my::function();

    // 중첩 모듈을 포함하여 public 아이템은 상위 모듈에서 접근된다.
    my::indirect_access();
    my::nested::function();

    // nested 모듈이 pub이라도 모듈의 Private 아이템은 
    // 직접적으로 접근 할 수 없다.

    // 에러! `private_function`은 private.
    //my::private_function();
    // TODO ^ 해당 라인의 주석을 제거해보세요.

    // 에러! `private_function`은 private
    //my::nested::private_function();
    // TODO ^ 해당 라인의 주석을 제거해보세요.

    // 에러! `private_nested`는 private 모듈
    //my::private_nested::function();
    // TODO ^ 해당 라인의 주석을 제거해보세요.
}

results matching ""

    No results matching ""