Julia 代码封装。这通常是个好主意吗?
Julia code encapsulation. Is this a generally good idea?
Julia 用户使用 module 关键字将功能封装到自己的模块中是否很常见?
我一直在研究模块,它们似乎使用 include 比实际使用 module 关键字更多。
更好的方法是什么?
Julia 有 3 个级别 "Places you can put code"
include
个文件
- 子模块
- packages——为了我们的目的,它只有 1 个(非子)模块。
鉴于我来自 python。
,我曾经是子模块的忠实粉丝
但是 julia 中的子模块不是很好。
根据我的经验,从开发人员和用户的角度来看,使用它们编写的代码往往很烦人。
它只是不干净地工作。
我已经从我的至少一个包中删除了子模块,并切换到普通 include
s.
Python 需要子模块,以帮助处理其命名空间 -- "Namespaces are great, lets do more of those"。
但是由于多重分派,julia 不会 运行 出函数名——你可以重复使用相同的名称,但类型签名不同,这很好(好偶数)
一般来说,子模块允许您将每个子模块彼此分离和解耦。但在那种情况下,你为什么不使用完全独立的包呢? (具有共同的依赖性)
我发现子模块出错的地方:
说你有:
- module A
- module B (i.e A.B)
- type C
一个人通常会做 using A.B
但是错误地你可以做 using B
,因为 B 可能在你的 LOAD_PATH 中一个名为 B.jl
的文件中。
如果你这样做,那么你想要访问类型C
。
如果您完成了 using A.B
,那么当您输入语句 B.C()
时,您将得到一个类型 A.B.C
。
但是,如果您错误地完成了 using B
,那么 B.C()
会为您提供类型 B.C
。
而且这种类型不兼容,因为函数(因为它们做对了 using
)期望为 A.B.C
。
只是有点乱。
另外reload("A.B")
也不行。
(然而 reload
通常效果不佳)
Base
是使用子模块(据我所知)的唯一主要 julia 代码块之一。甚至 Base
也被推送到 julia 0.7 的单独 (stdlib) 包中。
简而言之,如果您正在考虑使用子模块,
检查这不是你从另一种语言带过来的习惯。
并考虑您是否不只是想发布另一个单独的包。
Julia 用户使用 module 关键字将功能封装到自己的模块中是否很常见?
我一直在研究模块,它们似乎使用 include 比实际使用 module 关键字更多。
更好的方法是什么?
Julia 有 3 个级别 "Places you can put code"
include
个文件- 子模块
- packages——为了我们的目的,它只有 1 个(非子)模块。
鉴于我来自 python。
,我曾经是子模块的忠实粉丝但是 julia 中的子模块不是很好。
根据我的经验,从开发人员和用户的角度来看,使用它们编写的代码往往很烦人。
它只是不干净地工作。
我已经从我的至少一个包中删除了子模块,并切换到普通 include
s.
Python 需要子模块,以帮助处理其命名空间 -- "Namespaces are great, lets do more of those"。 但是由于多重分派,julia 不会 运行 出函数名——你可以重复使用相同的名称,但类型签名不同,这很好(好偶数)
一般来说,子模块允许您将每个子模块彼此分离和解耦。但在那种情况下,你为什么不使用完全独立的包呢? (具有共同的依赖性)
我发现子模块出错的地方:
说你有:
- module A
- module B (i.e A.B)
- type C
一个人通常会做 using A.B
但是错误地你可以做 using B
,因为 B 可能在你的 LOAD_PATH 中一个名为 B.jl
的文件中。
如果你这样做,那么你想要访问类型C
。
如果您完成了 using A.B
,那么当您输入语句 B.C()
时,您将得到一个类型 A.B.C
。
但是,如果您错误地完成了 using B
,那么 B.C()
会为您提供类型 B.C
。
而且这种类型不兼容,因为函数(因为它们做对了 using
)期望为 A.B.C
。
只是有点乱。
另外reload("A.B")
也不行。
(然而 reload
通常效果不佳)
Base
是使用子模块(据我所知)的唯一主要 julia 代码块之一。甚至 Base
也被推送到 julia 0.7 的单独 (stdlib) 包中。
简而言之,如果您正在考虑使用子模块, 检查这不是你从另一种语言带过来的习惯。 并考虑您是否不只是想发布另一个单独的包。