Джулия: Каковы вероятные причины того, что метод не может получить доступ к методу конвертации? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть модуль - давайте назовем его 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)

Проблема, описанная выше, может быть исправлена.

1 Ответ

0 голосов
/ 13 октября 2018

Вы скрыли функцию.Если вы определяете что-то вроде

> convert(::Type{Float64},x) = 2
convert (generic function with 1 method)

> convert(Float64,5)
2

Теперь convert и Base.convert различны.Если вы намеревались добавить рассылки к Base.convert, то вам нужно сделать Base.convert(x,y) = ....

Обратите внимание, что если вы сначала используете функцию, Джулия предупредит вас, что:

> convert(Float64,2)
2.0

> convert(::Type{Float64},x) = 2
ERROR: error in method definition: function Base.convert must be explicitly imported to be extended
Stacktrace:
 [1] top-level scope at none:0
...