朱莉娅:方法无法访问转换方法的可能原因是什么?

时间:2018-10-10 09:45:19

标签: julia

我有一个模块-称为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

因此我可以从REPL中找到并使用convert函数,但是其他函数不能使用此convert吗?可能有什么原因?

编辑:

花了一些时间试图将我的源代码减少到可以重现我发现的问题并修复问题的根源。

我在源文件中的另一个文件中

function convert(::Type{Vector{MyTypeB}}, a::MyTypeC)

通过将其更改为

function Base.convert(::Type{Vector{MyTypeB}}, a::MyTypeC)

上面详述的问题可以解决。

1 个答案:

答案 0 :(得分:1)

您已遮盖该功能。如果您定义类似

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

> convert(Float64,5)
2

现在convertBase.convert不同。如果要向Base.convert添加调度,则应该执行Base.convert(x,y) = ...

请注意,如果您首先使用函数,Julia会警告您:

> 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