Understanding (automatic?) Deref/coercion when adding references and values of numbers

后端 未结 1 1330
醉梦人生
醉梦人生 2020-12-18 04:22

How to make sense of the following piece of code? I\'m new to Rust but have background on C/Haskell and a little bit C++. The only reference I can find is to deref coercions

相关标签:
1条回答
  • 2020-12-18 04:58

    There is no auto-deref or coercion here, i + x works simply because u32 implements both Add<u32> and Add<&u32>. If you check the docs for u32, you'll find the following four trait impls:

    impl Add<u32> for u32
    impl<'a> Add<u32> for &'a u32
    impl<'a> Add<&'a u32> for u32
    impl<'a, 'b> Add<&'a u32> for &'b u32
    

    u32 only implements AddAssign<u32> but not AddAssign<&u32> (this is a bug and will be fixed in 1.18 or 1.19 fixing it causes regression which means this impl probably needs to wait for Rust 2.0), so i += x is an error.

    impl AddAssign<u32> for u32
    //impl<'a> AddAssign<&'a u32> for u32 <-- is missing.
    

    Why does auto-dereferencing not happen? — Auto-deref only happens when it is a receiver i.e. the "self" in a method call foo.bar(). x is not a "self" argument and + is not a method call. So there's no auto-deref here. See What are Rust's exact auto-dereferencing rules? for detail.

    0 讨论(0)
提交回复
热议问题