Julia如何将构造函数拆分到独立文件并解决默认构造函数覆盖问题
Julia 拆分结构体定义与构造函数到不同模块的解决方法
问题原因
你遇到的报错本质是Julia作用域规则导致的:在Constructors模块中直接定义function MyStruct()时,Julia默认会在当前模块创建一个全新的同名函数,而非给从StructDef导入的MyStruct构造函数扩展新方法,因此原有的带Int参数的默认构造函数会被本地的新函数覆盖,调用时自然找不到对应签名的方法。
解决方法
只需要在Constructors模块中显式声明你要扩展的是来自StructDef的MyStruct函数即可,不需要每次调用加模块前缀,修改后的Constructors.jl代码如下:
# in file Constructors.jl module Constructors using StructDef # 关键声明:导入StructDef的MyStruct,表明后续定义是扩展该函数的新方法,而非新建同名函数 import StructDef: MyStruct function MyStruct( ) o = MyStruct(5) # 现在可以直接识别到StructDef中定义的带Int参数的默认构造函数 return o end # 可选配置:如果希望其他模块using Constructors时可以直接用到所有构造方法,也可以导出MyStruct export MyStruct end
后续用法说明
修改完成后:
- 在
Constructors模块内部可以直接调用所有签名的MyStruct构造函数,不需要加StructDef.前缀 - 主文件中如果执行
using StructDef, Constructors,可以直接调用MyStruct()和MyStruct(整数)两个构造方法,不需要加任何模块前缀
# 优化后的main.jl using StructDef using Constructors m1 = MyStruct() m2 = MyStruct(10) print(m1.ia,"\n") # 输出5 print(m2.ia,"\n") # 输出10
内容的提问来源于stack exchange,提问作者roy.atlas
相关产品推荐
相关产品推荐

