【问题标题】:How to put constructors in another file in Julia?如何将构造函数放在 Julia 的另一个文件中?
【发布时间】:2021-11-24 22:35:12
【问题描述】:

Julia 结构体和构造器被组织在单独的文件中,如下所示:

# in file StructDef.jl

module StructDef
export MyStruct
struct MyStruct
    ia::Int
end
end


# infile Constructors.jl
module Constructors
using StructDef

function MyStruct( )
    # The following line throws the error: "ERROR: LoadError: MethodError: no method matching MyStruct(::Int64)"
    o = MyStruct(5) # should be replaced by
    #o = StructDef.MyStruct(5)
    return o
end
end



# in file main.jl
using StructDef
import Constructors

MyStruct(::Int64)"
m1 = Constructors.MyStruct( ) 

print(m1.ia,"\n");

在注释行中,默认构造函数MyStruct(::Int64) 似乎被本地函数MyStruct() 覆盖。如果这是真的,那么有没有办法让模块Constructors 看到默认构造函数?

【问题讨论】:

  • 您的问题是StructDef.MyStructConstructors.MyStruct同一类型,它们是碰巧共享相同名称的两个不同类型。如果您想扩展构造函数,请尝试为 StructDef.MyStruct 定义一个方法。
  • 我发现问题可以通过简单地将函数 MyStruct 重命名为另一个名称(例如 constructMyStruct )来规避。引擎盖下的过程可能是编译器将 'MyStruct()' 定向到 'Constructors.MyStruct()' 但 'Type.MyStruct(::Int)' 被覆盖,尽管已使用 'using ...' 导入子句。

标签: module constructor julia overriding default-constructor


【解决方案1】:

你可以有多个文件但只有一个模块,这是最简单的方法:

module MyModule
include("structs.jl")
include("functions.jl")
end

在你的情况下,为了代码清晰,我相信“构造函数”应该在定义之后

如果您真的想要子模块并在它们之间导入/导出,请查看documentation about submodules

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2016-07-03
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多