导入类型化的函数

时间:2018-12-02 19:16:05

标签: julia

我似乎无法导入带有类型化参数的函数。幸运的是,我有一个失败的例子。

给出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类型/结构吗?

1 个答案:

答案 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.jlutils.jl文件独立存在。然后,您应该使用structs.jl制作一个包,然后可以将其加载到模块内部的utils.jl以及外部范围的import_test.jl中,Julia会知道Query是相同的定义。 Julia手册中的here中介绍了实现此步骤的步骤。