superself

super及びselfキーワードは、要素にアクセスする際に、曖昧さをなくし、不必要なハードコーディングを避けるために使用できます。

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

mod cool {
    pub fn function() {
        println!("called `cool::function()`");
    }
}

mod my {
    fn function() {
        println!("called `my::function()`");
    }
    
    mod cool {
        pub fn function() {
            println!("called `my::cool::function()`");
        }
    }
    
    pub fn indirect_call() {
        // `function`という名の様々な関数をこのスコープ内から参照してみましょう。
        print!("called `my::indirect_call()`, that\n> ");
        
        // `self`キーワードは現在のモジュールスコープを示します。
        // この場合は`my`です。`self::function()`と`funcition()`は
        // 同じ関数であるため、同じ結果になります。
        self::function();
        function();
        
        // `my`以下の別のモジュールを呼び出す際に
        // `self`を用いて明示的に参照できます。
        self::cool::function();
        
        // `super`は親スコープ(`my`の外側)を参照します。
        super::function();
        
        // 以下は *クレート* スコープ内の`cool::function`を束縛します。
        // この場合、クレートスコープは一番外側のスコープです。
        {
            use crate::cool::function as root_function;
            root_function();
        }
    }
}

fn main() {
    my::indirect_call();
}