I noticed that in the std library, some APIs use "static" method that takes an argument of their own type instead of using Self.
Is there a reason of that ?
For example for ManuallyDrop in std::mem - Rust
Why pub unsafe fn take(slot: &mut ManuallyDrop<T>) -> T instead of pub unsafe fn take(slot: &mut Self) -> T ?
They are equivalent, inside an impl block Self is an alias to the type you're implementing for. Generally it's just personal preference whether to use one or the other.
If you are instead asking why it isn't defined to take an &mut self parameter (note that this is different than slot: &mut Self! &mut self allows the method call syntax, slot: &mut Self doesn't), then see alice's answer.