# `super` and `self`

The `super` and `self` keywords can be used in the path to remove ambiguity when accessing items and to prevent unnecessary hardcoding of paths.

    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() {
            // Let's access all the functions named `function` from this scope!
            print!("called `my::indirect_call()`, that\n> ");

            // The `self` keyword refers to the current module scope - in this case `my`.
            // Calling `self::function()` and calling `function()` directly both give
            // the same result, because they refer to the same function.
            self::function();
            function();

            // We can also use `self` to access another module inside `my`:
            self::cool::function();

            // The `super` keyword refers to the parent scope (outside the `my` module).
            super::function();

            // This will bind to the `cool::function` in the *crate* scope.
            // In this case the crate scope is the outermost scope.
            {
                use crate::cool::function as root_function;
                root_function();
            }
        }
    }

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