julia struct внутренний конструктор необязательная спецификация типа - PullRequest
1 голос
/ 29 мая 2020

Рассмотрим следующую структуру:

struct MyType1{T}
    data::T
end

Ее можно создать двумя способами:

println(MyType1(5))                 # MyType1{Int64}(5)
println(MyType1{Int}(5))            # MyType1{Int64}(5)

Когда я определяю нечто подобное с помощью внутреннего конструктора:

struct MyType2{T}
    data::T
    MyType2(x::T) where T = new{T}(x)
end

struct MyType3{T}
    data::T
    MyType3{T}(x::T) where T = new{T}(x)
end

Я могу создать их экземпляры только одним способом:

println(MyType2(5))                 # MyType2{Int64}(5)
println(MyType2{Int}(5))            # MethodError

println(MyType3(5))                 # MethodError
println(MyType3{Int}(5))            # MyType3{Int64}(5)

Как сделать спецификацию типа во внутреннем конструкторе необязательной (сделайте MyType2 и MyType3, чтобы не выбрасывать MethodError в приведенном выше примере) ?

версия julia 1.4.1

1 Ответ

2 голосов
/ 30 мая 2020

Просто укажите дополнительный конструктор:

struct MyType4{T}
   data::T
   MyType4{T}(x::T) where T = new{T}(x)
end

MyType4(x::T) where T = MyType4{T}(x)

Test

julia> MyType4{Int}(5)
MyType4{Int64}(5)

julia> MyType4(5)
MyType4{Int64}(5)
...