以下のようにモジュールの中で型を定義すると後で自由に変更可能になる.
module My
using Base: @kwdef
using Parameters: @unpack
@kwdef struct Foo{T<:Real, U<:AbstractVector{<:Real}}
p::T = 1.23456
A::U = Float64[3, 4, 1, 2]
end
function f(foo::Foo)
@unpack p, A = foo
@show (p, typeof(p))
@show (A, typeof(A))
foo
end
end
Main.My
foo_default = My.Foo()
My.f(foo_default)
(p, typeof(p)) = (1.23456, Float64) (A, typeof(A)) = ([3.0, 4.0, 1.0, 2.0], Array{Float64,1})
Main.My.Foo{Float64,Array{Float64,1}}(1.23456, [3.0, 4.0, 1.0, 2.0])
foo_another_A = My.Foo(A = [10, 20, 30, 40])
My.f(foo_another_A)
(p, typeof(p)) = (1.23456, Float64) (A, typeof(A)) = ([10, 20, 30, 40], Array{Int64,1})
Main.My.Foo{Float64,Array{Int64,1}}(1.23456, [10, 20, 30, 40])
Foo がパラメーター付きの型のおかげで, Float32のデータも扱える.
foo_Float32 = My.Foo(Float32(7.89), Float32[1, 4, 5, 10])
My.f(foo_Float32)
(p, typeof(p)) = (7.89f0, Float32) (A, typeof(A)) = (Float32[1.0, 4.0, 5.0, 10.0], Array{Float32,1})
Main.My.Foo{Float32,Array{Float32,1}}(7.89f0, Float32[1.0, 4.0, 5.0, 10.0])