実行環境 julia1.2, MacOS10.15
juliaのmethod dispatchで、どの型とも一致しなかった場合の処理を、型Anyで書けばうまくいくのかどうか確認した。(マニュアル読めばわかるだろうけど、さがすのが面倒)
とりあえず、3つ型を定義する。
struct A
x::String
end
struct B
y::Number
end
struct C
z::Symbol
end
methodの定義をこうする。
引数がAでもBでもないとき、Anyの定義だけが使われれば吉。
classの継承だと、親のmethodが呼ばれたりするので、それに似た振る舞いだと、AやBのときもAnyの定義が使われてしまわないことを確認したい。
f(x::A) = "with A"
f(x::Any) = "with others"
f(x::B) = "with B"
Bの定義を最後にもってきたのは、定義の順番が関係しないか気になったので。
最後に、期待値を@testで書くとこんな感じ。
わたしの常識では、こうなっているはず。
using Test
@test f(A("i am A")) == "with A"
@test f(C(:others)) == "with others"
@test f(124) == "with others"
@test f(B(123)) == "with B"
実行すると、こうなったのでめでたし。
julia> include("methods.jl")
Test Passed
マニュアルさがすより面倒だったかもしれないが、動かしたほうが記憶できる。