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