Julia 中的结构重复

thi*_*osh 4 struct julia

我有一个名为 的包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

Prz*_*fel 7

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)