# Multiple dispach method overwritten

**URL:** <https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838>\
**Category:** General Usage\
**Created:** [November 2, 2017, 1:29am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838 "2017-11-02T01:29:57Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [November 2, 2017, 1:29am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/1 "2017-11-02T01:29:57Z")

</div>

Hi, I don’t understand why I’m getting this warning.

```julia
WARNING: Method definition grdtrack() in module GMT at c:\j\.julia\v0.6\GMT\src\grdtrack.jl:51 overwritten at c:\j\.julia\v0.6\GMT\src\grdtrack.jl:150.
WARNING: Method definition #grdtrack(Array{Any, 1}, typeof(GMT.grdtrack)) in module GMT overwritten.

```

The lines in question from [this file](https://github.com/GenericMappingTools/GMT.jl/blob/master/src/grdtrack.jl), read

```julia
# ---------------------------------------------------------------------------------------------------
function grdtrack(cmd0::String="", arg1=[], arg2=[]; data=[], kwargs...)
...
end
grdtrack(arg1=[], arg2=[], cmd0::String=""; data=[], kw...) = grdtrack(cmd0, arg1, arg2; data=data, kw...)

```

The type of the positional arguments is not the same, so why does it say it’s the same method?

---

<div class="post-metadata">

**Author:** ![greg\_plowman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/greg_plowman/32/8100_2.png) [@greg\_plowman](https://discourse.julialang.org/u/greg_plowman)\
**Post date:** [November 2, 2017, 2:35am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/2 "2017-11-02T02:35:25Z")

</div>

Both methods have defaults for _all_ positional arguments, so if you call `grdtrack()`, which method should be invoked?

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [November 2, 2017, 2:45am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/3 "2017-11-02T02:45:05Z")

</div>

You mean without any argument as in?

```julia
grdtrack()

```

Well, for my case it doesn’t matter because without arguments the call is interpreted as a request to print a on line help and quit (which it does correctly)

---

<div class="post-metadata">

**Author:** ![greg\_plowman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/greg_plowman/32/8100_2.png) [@greg\_plowman](https://discourse.julialang.org/u/greg_plowman)\
**Post date:** [November 2, 2017, 3:03am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/4 "2017-11-02T03:03:21Z")

</div>

What I mean is that the ambiguity is for the method with no arguments, `grdtrack()`.  
It could match the definition at line 51 or the definition at line 150.

From [https://docs.julialang.org/en/stable/manual/functions/#Optional-Arguments-1](https://docs.julialang.org/en/stable/manual/functions/#Optional-Arguments-1)

“Optional arguments are actually just a convenient syntax for writing multiple method definitions with different numbers of arguments (see [Note on Optional and keyword Arguments](https://docs.julialang.org/en/stable/manual/methods/#Note-on-Optional-and-keyword-Arguments-1)).”

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [November 2, 2017, 3:11am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/5 "2017-11-02T03:11:41Z")

</div>

Thanks, I understand now what you mean. But what is the difference to this case? Here I also can call `foo()` and no ambiguity is reported.

```julia
julia> foo(a::String="", b=[]; v=false, c=[], kw...) = 1
foo (generic function with 3 methods)

julia> foo(a=[], b::String=""; v=false, c=[], kw...) = foo(b, a; v=false, c=[], kw...)
foo (generic function with 5 methods)

```

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [November 2, 2017, 3:45am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/6 "2017-11-02T03:45:07Z")

</div>

> [@joa-quim](#):
>
> But what is the difference to this case?

How is the language supposed to know that it doesn’t matter to you?

---

<div class="post-metadata">

**Author:** ![greg\_plowman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/greg_plowman/32/8100_2.png) [@greg\_plowman](https://discourse.julialang.org/u/greg_plowman)\
**Post date:** [November 2, 2017, 5:58am UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/7 "2017-11-02T05:58:40Z")

</div>

> [@joa-quim](#):
>
> Here I also can call foo() and no ambiguity is reported.

I think at the REPL for `Main` module only, the first no-argument `foo` method is overwritten silently.  
But if you wrap into a module, then you’ll get the method overwritten warning:

```julia
module Test
    foo(a::String="", b=[]; v=false, c=[], kw...) = 1
    foo(a=[], b::String=""; v=false, c=[], kw...) = foo(b, a; v=false, c=[], kw...)
end

```

Also I think method redefinition warnings might change in v0.7:

[RFC: only warn for method overwrites if the two modules are different and in interactive mode by KristofferC · Pull Request #23030 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/23030#issuecomment-321612882)

[RFC: add command option to remove method redefinition warnings by KristofferC · Pull Request #23002 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/23002)

Also note that you’ll still have the conflict and overwritten method, just no warning.

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [November 2, 2017, 12:26pm UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/8 "2017-11-02T12:26:42Z")

</div>

Ok, thanks, that explains completely what is going on. But I’m confused with the issues. #23030 is closed and #23002 was merged but I still get the same warnings with v0.7

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [November 2, 2017, 12:50pm UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/9 "2017-11-02T12:50:05Z")

</div>

Only when precompiling?

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [November 2, 2017, 2:52pm UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/10 "2017-11-02T14:52:19Z")

</div>

> Only when precompiling?

Yes.  
Is it the expected behavior?

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [November 2, 2017, 3:39pm UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/11 "2017-11-02T15:39:35Z")

</div>

Yes.

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [November 2, 2017, 3:43pm UTC](https://discourse.julialang.org/t/multiple-dispach-method-overwritten/6838/12 "2017-11-02T15:43:01Z")

</div>

OK, and thanks for pushing this.
