我有一个模块-称为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)
上面详述的问题可以解决。
答案 0 :(得分:1)
您已遮盖该功能。如果您定义类似
> convert(::Type{Float64},x) = 2
convert (generic function with 1 method)
> convert(Float64,5)
2
现在convert
和Base.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