У меня есть модуль - давайте назовем его MyMod
- который содержит mutable struct MyType
.В том же исходном файле я определяю функции, связанные с MyType
.Одной из этих функций является Base.convert(::Type{Vector{T}}, a::MyType) where T <: Real
.Другой, позже, это my_func(a::MyType)
.my_func
внутренне использует указанную функцию convert
.
Я могу попробовать это с помощью Julia REPL:
push!(LOAD_PATH, "path/to/src/")
import MyMod
# Lets check our convert method exists:
hasmethod(convert, Tuple{Type{Vector{Float64}}, MyMod.MyType})
# Returns true
# Make an instance of MyType
a = MyType(1,2,3)
# And we can convert this using our method that we know exists:
convert(Vector{Float64}, a)
# Returns 1.0, 2.0, 3.0. Great.
# How about that function that we made?
MyMod.my_func(a)
# ERROR: MethodError: no method matching convert(::Type{Array{Float64, 1}}, ::MyMod.MyType)
# You may have intended to import Base.convert
Так что я могу найти и использовать функцию convert
из REPL, но другие функции не могут использовать это convert
?Какие могут быть причины для этого?
РЕДАКТИРОВАТЬ:
Потратив некоторое время, пытаясь сократить мой исходный код до минимума, который может воспроизвести проблему, которую я обнаружил, и исправить виновника.
В другом файле в исходном коде у меня есть
function convert(::Type{Vector{MyTypeB}}, a::MyTypeC)
Изменив это значение на
function Base.convert(::Type{Vector{MyTypeB}}, a::MyTypeC)
Проблема, описанная выше, может быть исправлена.