Почему в Julia 1.0 не работает следующее объявление типа и / или инструкция? - PullRequest
2 голосов
/ 09 февраля 2020

У меня есть тип круга

struct Circle{T <: Real}
  # radius is a subtype of
  # the real number approximation types
  R::T
  # The center is a named pair of real
  # number approximation types
  C::NamedTuple{T, T}
end

, который я хотел бы создать с помощью

circles = NamedTuple(
    A = Circle(1, ( 1,  1)),
    B = Circle(1, ( 2,  2))
  )

, который выдает ошибку

ERROR: LoadError: MethodError: no method matching Circle(::Int64, ::Tuple{Int64,Int64})
Closest candidates are:
  Circle(::T<:Real, ::NamedTuple{T<:Real,T<:Real}) where T<:Real

Почему эта ошибка происходит и что я делаю не так?

1 Ответ

1 голос
/ 09 февраля 2020

Именованные кортежи параметризованы именами и кортежем:

julia> struct Circle{T <: Real}
         R::T
         C::NamedTuple
         Circle(r::T, c::NamedTuple{N,Tuple{T,T}}) where {N, T <: Real} = new{T}(r,c)
       end

julia> Circle(1, (a=1, b=2))
Circle{Int64}(1, (a = 1, b = 2))

Если вы хотите создать Circle с кортежем, вы можете предоставить отображение по умолчанию:

julia> function Circle(r::T, c::Tuple{T,T}) where {T <: Real}
           a, b = c
           return Circle(r, (a=a, b=b))
       end
Circle

julia> Circle(1, (1, 2))
Circle{Int64}(1, (a = 1, b = 2))

Если вам не нужны именованные кортежи, вы можете использовать обычные кортежи:

julia> struct Circle{T <: Real}
         R::T
         C::Tuple{T, T}
       end

julia> Circle(1, (1, 2))
Circle{Int64}(1, (1, 2))
...