Jupyter with Julia results in unexpected type error: no method matching

Jupyter with Julia results in unexpected type error: no method matching

在 Jupyter 中 运行 以下 Julia 代码时出现意外类型错误,其中看似简单的导入出错:

include("./imp.jl")
include("./imp2.jl")
n = Main.Imp.Network([1,2])
Imp2.p2(n)

这会导致以下错误:

MethodError: no method matching p(::Main.Imp.Network)
Closest candidates are:
  p(::Main.Imp2.Imp.Network) at /Users/cg/Dropbox/code/Julia/learning/imp.jl:11

代码如下。这是怎么发生的?

Imp.jl:

module Imp

export Network, p

mutable struct Network
  a::Array{Any,1}
end

function p(network::Network)
  network
end

end

Imp2.jl:

module Imp2
include("./imp.jl")

function p2(network)
  Imp.p(network)
end

end

下面还有更多错误:

Stacktrace:
 [1] p2(network::Main.Imp.Network)
   @ Main.Imp2 ~/Dropbox/code/Julia/learning/imp2.jl:5
 [2] top-level scope
   @ In[3]:4
 [3] eval
   @ ./boot.jl:360 [inlined]
 [4] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base ./loading.jl:1116

您可以:

module Imp2
using Main.Imp
function p2(network)
  Imp.p(network)
end
end

OR(不在模块定义之外采购 imp.jl

module Imp2
include("./imp.jl")
using .Imp
function p2(network)
  Imp.p(network)
end
end

在第二种情况下,您的 Julia 代码可能如下所示:

julia> using Main.Imp2

julia> n = Imp2.Imp.Network([1,2])
Main.Imp2.Imp.Network(Any[1, 2])

julia> Imp2.p2(n)
Main.Imp2.Imp.Network(Any[1, 2])

此外,如果您将 export Imp 添加到 Imp2 模块,您可以编写 Imp.Network([1,2]) 而不是 Imp2.Imp.Network([1,2])