# Support \`mut &self\` Syntax

**URL:** <https://internals.rust-lang.org/t/support-mut-self-syntax/11080>\
**Category:** language design\
**Created:** [October 10, 2019, 2:29am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080 "2019-10-10T02:29:03Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![lihzhang](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/lihzhang/32/6160_2.png) [@lihzhang](https://internals.rust-lang.org/u/lihzhang)\
**Post date:** [October 10, 2019, 2:29am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/1 "2019-10-10T02:29:04Z")

</div>

We can write `fn method(&self, mut a: i32)` but can't write `fn method(mut &self, a: i32)`. However, there is a workaround `fn method(mut self: &Self, a: i32)`.

Supporting `mut &self` and `mut &mut self` seems to keep consistency.

---

<div class="post-metadata">

**Author:** ![RustyYato](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/rustyyato/32/13627_2.png) [@RustyYato](https://internals.rust-lang.org/u/RustyYato)\
**Post date:** [October 10, 2019, 2:31am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/2 "2019-10-10T02:31:13Z")

</div>

Why would you want to do this?

---

<div class="post-metadata">

**Author:** ![lihzhang](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/lihzhang/32/6160_2.png) [@lihzhang](https://internals.rust-lang.org/u/lihzhang)\
**Post date:** [October 10, 2019, 2:33am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/3 "2019-10-10T02:33:22Z")

</div>

This is a compiled code.

```rust
use std::fmt;
enum List {
    Cons(i32, Box<List>),
    Nil,
}

impl fmt::Display for List {
    fn fmt(mut self: &Self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "[")?;
        while let List::Cons(item, tail) = self {
            write!(f, "{}, ", item)?;
            self = tail;
        }
        write!(f, "Nil]")
    }
}

fn main() {
    let mut list = List::Cons(1, Box::new(List::Nil));
    println!("{}", list);
}

```

---

<div class="post-metadata">

**Author:** ![DDOtten](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/ddotten/32/4334_2.png) [@DDOtten](https://internals.rust-lang.org/u/DDOtten)\
**Post date:** [October 10, 2019, 3:12am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/4 "2019-10-10T03:12:27Z")

</div>

I think `self` should remain the instance the method was called on. You can easily write that code with `let mut current = self;`.

---

<div class="post-metadata">

**Author:** ![lihzhang](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/lihzhang/32/6160_2.png) [@lihzhang](https://internals.rust-lang.org/u/lihzhang)\
**Post date:** [October 10, 2019, 3:57am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/5 "2019-10-10T03:57:55Z")

</div>

And now `self` can be reassigned. Should restrict or relax the usage maybe.

---

<div class="post-metadata">

**Author:** ![RustyYato](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/rustyyato/32/13627_2.png) [@RustyYato](https://internals.rust-lang.org/u/RustyYato)\
**Post date:** [October 10, 2019, 4:15am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/6 "2019-10-10T04:15:17Z")

</div>

I think the current state of affairs is good enough. Reassigning self doesn't come up that often, so we don't need to cater to it that well and using `mut self: &Self` is good enough for such a niche use. On a less important note, I find `mut &self` to be confusing and ugly. Confusing, because `mut` is only ever applied to identifiers or `self`, never anything more than that.

---

<div class="post-metadata">

**Author:** ![Centril](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/centril/32/3334_2.png) [@Centril](https://internals.rust-lang.org/u/Centril)\
**Post date:** [October 10, 2019, 5:04am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/7 "2019-10-10T05:04:42Z")

</div>

> [@RustyYato](#):
>
> Reassigning self doesn't come up that often, so we don't need to cater to it that well and using `mut self: &Self` is good enough for such a niche use.

I would tend to agree, although fwiw I wanted `mut &self` just the other day in the compiler ([https://doc.rust-lang.org/nightly/nightly-rustc/src/rustc/ty/util.rs.html#1010-1016](https://doc.rust-lang.org/nightly/nightly-rustc/src/rustc/ty/util.rs.html#1010-1016) and a similar `peel_drop_temps` which @ekuber is introducing).

> [@RustyYato](#):
>
> Confusing, because `mut` is only ever applied to identifiers or `self` , never anything more than that.

I think this is the key point; we [decided](https://github.com/rust-lang/rfcs/pull/2401#issuecomment-478261562) that we weren't going to support `pat ::= ... | "mut" pat ;` and so `mut &self` becomes sorta weird in that light.

---

<div class="post-metadata">

**Author:** ![lihzhang](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/lihzhang/32/6160_2.png) [@lihzhang](https://internals.rust-lang.org/u/lihzhang)\
**Post date:** [October 10, 2019, 8:26am UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/8 "2019-10-10T08:26:35Z")

</div>

Agree. Also note that this code runs.

```rust
struct Struct(i32);
impl Struct {
    // `mut self` is quite common
    fn method(mut self) {
        // `self` reassigned
        self = Struct(self.0);
    }
}

```

---

<div class="post-metadata">

**Author:** ![RustyYato](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/rustyyato/32/13627_2.png) [@RustyYato](https://internals.rust-lang.org/u/RustyYato)\
**Post date:** [October 10, 2019, 3:11pm UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/9 "2019-10-10T15:11:04Z")

</div>

And note that `mut` is before an identifier or `self` and nothing else

---

<div class="post-metadata">

**Author:** ![system](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/system/32/14092_2.png) [@system](https://internals.rust-lang.org/u/system)\
**Post date:** [January 8, 2020, 3:11pm UTC](https://internals.rust-lang.org/t/support-mut-self-syntax/11080/10 "2020-01-08T15:11:11Z")

</div>

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.
