Rationale for relative vs absolute paths being different in use statements?

I'm a little confused why use statements in operate on absolute paths, whereas everything else uses relative paths. This is particularly noticeable when nesting modules...

mod foo {
    mod bar {
        use std::mem; // use can refer to crates using absolute paths without ::

        fn func() -> usize {
            ::std::mem::size_of(f32); // but here we have to explicitly specify absolute path with ::
        }
    }
}

What is the rationale for these two cases having subtly different behaviour?

1 Like

This is super confusing as you observed. It is going to be fixed. Check out RFC 2126 for the accepted design proposal and rust-lang/rust#44660 for the tracking issue that records progress toward supporting the improved approach in the compiler.

2 Likes

use statements currently default to absolute paths "because" they tend to be used to import things from dependencies or across the module hierarchy, so this is a useful shortcut.

They do not include the ability to reference relative names because this is very challenging and confusing to implement correctly.