# How to overload +=?

**URL:** <https://discourse.julialang.org/t/how-to-overload/71523>\
**Category:** General Usage\
**Created:** [November 15, 2021, 7:46pm UTC](https://discourse.julialang.org/t/how-to-overload/71523 "2021-11-15T19:46:50Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![mzaffalon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mzaffalon/32/214168_2.png) [@mzaffalon](https://discourse.julialang.org/u/mzaffalon)\
**Post date:** [November 15, 2021, 7:46pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/1 "2021-11-15T19:46:50Z")

</div>

Is it possible to overload `+=`?

```julia
mutable struct A
    a::Int
end

function Base.:+=(a::A, b::A)
  a.a += b.a
  a
end

```

**EDIT:** As pointed out by @giordano in [post 7](https://discourse.julialang.org/t/how-to-overload/71523/7), the struct `A` should be defined immutable:

```julia
struct A
    a::Int
end

```

---

<div class="post-metadata">

**Author:** ![baggepinnen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baggepinnen/32/693_2.png) [@baggepinnen](https://discourse.julialang.org/u/baggepinnen)\
**Post date:** [November 15, 2021, 7:49pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/2 "2021-11-15T19:49:42Z")

</div>

You can’t overload assignment, but I think it’s enough in this case to overload `+` and `+=` will come for free.

---

<div class="post-metadata">

**Author:** ![mzaffalon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mzaffalon/32/214168_2.png) [@mzaffalon](https://discourse.julialang.org/u/mzaffalon)\
**Post date:** [November 15, 2021, 7:53pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/3 "2021-11-15T19:53:15Z")

</div>

Thank you for the quick reply but it does not seem to work:

```julia
julia> Base.:+(a::A, b::A) = A(a.a+b.a)

julia> A(2) + A(3)
A(5)

julia> A(2) += A(3)
ERROR: syntax: invalid assignment location "A(2)" around REPL[12]:1
Stacktrace:
 [1] top-level scope
   @ REPL[12]:1

```

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [November 15, 2021, 7:59pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/4 "2021-11-15T19:59:28Z")

</div>

```julia
x = A(2)
x += A(3)
A(5)

```

---

<div class="post-metadata">

**Author:** ![StevenWhitaker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevenwhitaker/32/9749_2.png) [@StevenWhitaker](https://discourse.julialang.org/u/StevenWhitaker)\
**Post date:** [November 15, 2021, 8:00pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/5 "2021-11-15T20:00:41Z")

</div>

> [@mzaffalon](#):
>
> `julia> A(2) += A(3)`

This is basically the same as

```julia
julia> 1 += 2

```

which of course doesn’t work.

---

<div class="post-metadata">

**Author:** ![mzaffalon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mzaffalon/32/214168_2.png) [@mzaffalon](https://discourse.julialang.org/u/mzaffalon)\
**Post date:** [November 15, 2021, 8:01pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/6 "2021-11-15T20:01:15Z")

</div>

🤦‍♂️ Thank you.

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [November 15, 2021, 8:03pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/7 "2021-11-15T20:03:09Z")

</div>

> [@mzaffalon](#):
>
> ```julia
> julia> Base.:+(a::A, b::A) = A(a.a+b.a)
> 
> ```

Note that this wouldn’t mutate the argument (which one?), in case this is what you were expecting, since you marked the type as mutable.

---

<div class="post-metadata">

**Author:** ![mzaffalon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mzaffalon/32/214168_2.png) [@mzaffalon](https://discourse.julialang.org/u/mzaffalon)\
**Post date:** [November 15, 2021, 8:09pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/8 "2021-11-15T20:09:02Z")

</div>

But the sum should not mutate neither argument: it is only `+=` that should. Am I wrong?

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [November 15, 2021, 8:17pm UTC](https://discourse.julialang.org/t/how-to-overload/71523/9 "2021-11-15T20:17:03Z")

</div>

Assignment, including `+=`, never mutates. Is this what you were expecting?
