# Struct default value in constructor

**URL:** <https://discourse.julialang.org/t/struct-default-value-in-constructor/86648>\
**Category:** General Usage\
**Tags:** struct\
**Created:** [September 1, 2022, 4:22pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648 "2022-09-01T16:22:33Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Renan\_Rabelo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/renan_rabelo/32/8048_2.png) [@Renan\_Rabelo](https://discourse.julialang.org/u/Renan_Rabelo)\
**Post date:** [September 1, 2022, 4:22pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648/1 "2022-09-01T16:22:34Z")

</div>

I need the following struct:

```julia
struct Foo
    bar
    baz
    qux = bar + baz

```

The problem is that in constructor I need to set the value of “qux”, and I want the value only depend on “bar” and “baz”.

How can instantiate a struct only setting the value of some of it’s fields?

Thanks.

---

<div class="post-metadata">

**Author:** ![DrChainsaw](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/drchainsaw/32/8497_2.png) [@DrChainsaw](https://discourse.julialang.org/u/DrChainsaw)\
**Post date:** [September 1, 2022, 4:35pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648/2 "2022-09-01T16:35:30Z")

</div>

I think an [inner constructor](https://docs.julialang.org/en/v1/manual/constructors/#man-inner-constructor-methods) might be what you want here.

---

<div class="post-metadata">

**Author:** ![mrufsvold](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mrufsvold/32/31600_2.png) [@mrufsvold](https://discourse.julialang.org/u/mrufsvold)\
**Post date:** [September 1, 2022, 4:39pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648/3 "2022-09-01T16:39:39Z")

</div>

```julia
struct Foo
    bar
    baz
    qux
    Foo(bar, baz, qux) = (bar+baz) == qux ? error("qux must be the sum of bar and baz") : new(bar, baz, qux)
end

Foo(bar, baz) = Foo(bar, baz, bar+baz)

```

You can add an outer constructor to do the addition work on construction and use an inner constructor like @Renan_Rabelo suggested to enforce the rule.

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [September 1, 2022, 4:48pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648/4 "2022-09-01T16:48:54Z")

</div>

It seems easier to only take two arguments in the inner constructor:

```julia
struct Foo
    bar
    baz
    qux
    Foo(bar, baz) = new(bar, baz, bar+baz)
end

```

---

<div class="post-metadata">

**Author:** ![mrufsvold](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mrufsvold/32/31600_2.png) [@mrufsvold](https://discourse.julialang.org/u/mrufsvold)\
**Post date:** [September 1, 2022, 5:50pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648/5 "2022-09-01T17:50:20Z")

</div>

You make a good point, @stevengj ! I was just thinking a more verbose error might be helpful to someone trying to make a new instance, depending on the situation.

---

<div class="post-metadata">

**Author:** ![mikmoore](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mikmoore/32/31109_2.png) [@mikmoore](https://discourse.julialang.org/u/mikmoore)\
**Post date:** [September 1, 2022, 6:07pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648/6 "2022-09-01T18:07:31Z")

</div>

If I understand your request correctly, a 2-argument outer constructor does what you’ve asked and there’s no need to fiddle with inner constructors. After all, you said you wanted a default value rather than it to always be exactly a particular value (which is where an inner constructor would have been useful).

```julia
struct Foo
    bar
    baz
    qux
end
Foo(bar,baz) = Foo(bar,baz,bar+baz)

Foo(1,2) # == Foo(1, 2, 3)
Foo(1,2,4) # == Foo(1, 2, 4)

```

---

<div class="post-metadata">

**Author:** ![Jake](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jake/32/46007_2.png) [@Jake](https://discourse.julialang.org/u/Jake)\
**Post date:** [September 1, 2022, 7:08pm UTC](https://discourse.julialang.org/t/struct-default-value-in-constructor/86648/7 "2022-09-01T19:08:49Z")

</div>

Thank you for the nice examples which prompted me to try a variation for a slightly different use case.

If I want to generate a structure but with a different type than the structure demands. I can use an outer constructor to do the conversion and generate the structure as follows:

```julia
julia> struct Foo
           bar::Real
           bas::Real
           qux::Real
       end

julia> Foo(bar,baz,qux::String) = Foo(bar,baz,parse(Int, qux))
Foo

julia> foo2 = Foo(1,1,"1")
Foo(1, 1, 1)

julia> foo1 = Foo(1,1,1)
Foo(1, 1, 1)

```
