неявные преобразования с пользовательскими типами? - PullRequest
2 голосов
/ 22 октября 2019

Со следующим кодом:

import Base.convert

abstract type MySequential end

struct MyFiniteSequence{T} <: MySequential
       vec::NTuple{N,T} where N
end

Base.convert(MyFiniteSequence, r) = MyFiniteSequence{typeof(r)}((r,))

Теперь попробуйте:

julia> convert(MyFiniteSequence, 1)
MyFiniteSequence{Int64}((1,))

Пока все хорошо. Теперь попробуйте выполнить преобразование имплика:

julia> MyFiniteSequence(1)
ERROR: MethodError: no method matching MyFiniteSequence(::Int64)
Closest candidates are:
  MyFiniteSequence(::Tuple{Vararg{T,N}} where N) where T at REPL[2]:2
Stacktrace:
 [1] top-level scope at REPL[5]:1

Я думаю, что есть проблема из-за аннотаций {T, N}, но я не уверен, как нужно изменить синтаксис преобразования. Есть ли способ определить convert, чтобы получить неявное преобразование из Int в struct?

1 Ответ

2 голосов
/ 22 октября 2019

Я считаю, что неявные вызовы конструктора для convert были удалены при переходе от julia 0.7 к 1.0. Но вы можете просто определить конструктор, который вызывает convert, если вы этого хотите:

julia> MyFiniteSequence(x) = Base.convert(MyFiniteSequence, x)
MyFiniteSequence

julia> MyFiniteSequence(1)
MyFiniteSequence{Int64}((1,))
...