我有一个名为 的包sandwich,它有:
flavours.jl定义 struct 的文件HamCheeseSandwich。
该文件factory.jl是一个首先运行的模块include("flavours.jl"),并且有一个方法make_sandwich创建一个,但它返回的HamCheeseSandwich不是生成一个HamCheeseSandwichsandwich.factory.HamCheeseSandwich
最后一个文件是printer.jl,这里制作的三明治factory.jl失败了MethodError: no method matching print_sandwich(::sandwich.factory.HamCheeseSandwich)
# printer.jl
function print_sandwich(sandwich::HamCheeseSandwich)
println("Enjoy your sandwich")
println(sandwich)
end
Run Code Online (Sandbox Code Playgroud)
当我检查类型时
Julia> sandwich.factory.HamCheeseSandwich == HamCheeseSandwich
false
Run Code Online (Sandbox Code Playgroud)
这表明问题是我使用include创建了两个版本的HamCheeseSandwich.
可以在这个仓库中看到一个工作示例:https ://github.com/this-josh/Julia-structs-question
可以使用以下命令重现此行为
using sandwich
s = factory.make_sandwich(true,false)
print_sandwich(s)
Run Code Online (Sandbox Code Playgroud)
我的问题是我应该如何在包中使用 include 来防止重复HamCheeseSandwich并确保我仍然可以输入提示,如printer.jl
HamSandwich您多次定义该类型,应该执行一次,然后引用该定义。
因此你的代码应该是:
module Sandwich
module Flavours
struct HamSandwich end
end
module Factory
import ..Flavours
makeSandwich() = Flavours.HamSandwich()
end
end
Run Code Online (Sandbox Code Playgroud)
测试:
julia> using Main.Sandwich
julia> Sandwich.Factory.makeSandwich()
Main.Sandwich.Flavours.HamSandwich()
Run Code Online (Sandbox Code Playgroud)