我似乎无法导入带有类型化参数的函数。幸运的是,我有一个失败的例子。
给出Query
中定义的structs.jl
:
module Structs
export Query
struct Query
name::String
data::Int
end
end
还有一个简单的函数dist
,它使用这种类型:
module Utils
include("structs.jl")
using .Structs: Query
export dist
function dist(x::Query, y::Query)
return (x.data - y.data) ^ 2
end
end
当我在dist
中调用import_test.jl
时为什么找不到它?
include("structs.jl")
using .Structs: Query
include("utils.jl")
using .Utils: dist
a = Query("a", 1)
b = Query("b", -1)
println(dist(a, b))
相反,它失败并显示以下错误:
ERROR: LoadError: MethodError: no method matching dist(::Query, ::Query)
Stacktrace:
[1] top-level scope at none:0
[2] include at .\boot.jl:317 [inlined]
[3] include_relative(::Module, ::String) at .\loading.jl:1041
[4] include(::Module, ::String) at .\sysimg.jl:29
[5] exec_options(::Base.JLOptions) at .\client.jl:229
[6] _start() at .\client.jl:421
in expression starting at C:\Users\mr_bo\julia_test\import_test.jl:13
但是,如果我从dist
函数中删除类型,使其变为function dist(x, y)
,就不会再出现该错误。
我错误地导入了Query
类型/结构吗?
答案 0 :(得分:3)
问题是您两次定义了模块Query
,而这是两个不同的模块。那么,来自一个模块的Query
与来自另一个模块的Query
不同。
您可以定义自己想要的内容(我给出一个没有include
语句的示例,但是您可以引入它们来获得相同的效果):
module Structs
export Query
struct Query
name::String
data::Int
end
end
module Utils
using ..Structs: Query
export dist
function dist(x::Query, y::Query)
return (x.data - y.data) ^ 2
end
end
using .Structs: Query
using .Utils: dist
a = Query("a", 1)
b = Query("b", -1)
println(dist(a, b))
现在您可能会说要让structs.jl
和utils.jl
文件独立存在。然后,您应该使用structs.jl
制作一个包,然后可以将其加载到模块内部的utils.jl
以及外部范围的import_test.jl
中,Julia会知道Query
是相同的定义。 Julia手册中的here中介绍了实现此步骤的步骤。