导入module后类型名称问题


#1

Definition.jl 中定义了点的坐标

module Definition
export Point
mutable struct Point
    x
    y
end
Point()=Point(0.0,0.0)
end  # module Definition

Distance.jl 中定义了距离运算

module Distance
include("Definition.jl")
using .Definition
export distance
function distance(p1::Point, p2::Point)
    dist = hypot(p1.x - p2.x, p1.y - p2.y)
    return dist
end
end  # module Distance

main.jl 中调用出错

include("Definition.jl")
include("Distance.jl")
using .Definition
using .Distance

p1 = Point(2, 3)
p2 = Point(4, 5)
distance(p1, p2)#MethodError: no method matching distance(::Point, ::Point)

请问是哪里出了问题


#2

不能这么搞,因为include的语义和C是一样的,仅仅是插入文件内容,所以你在Distance里重复了一遍Definition,导致Main.Definition.PointMain.Distance.Definition.Point是两个类型。

你应该在Distance里去掉include,然后using ...Definition

julia> distance(p1, p2)
2.8284271247461903

#3

这里的...是起什么作用?


#4

点表示相对路径。
一个点表示在当前模块下查找,两个点表示在上一层模块里查找。
手滑了,两个点就足够了(Distance​:arrow_up:Main​:arrow_down:Definition)


#5

问题解决了,感谢