Julia 编程 - 模块和包

Julia 编程语言中的模块用于将相关函数和其他定义组合在一起。 模块的结构如下所示 −

module ModuleName

end

我们可以在上面两行之间定义和放置函数、类型定义等。

安装模块

Julia 的包管理器可用于下载和安装特定的包。 要从 REPL 进入包管理,请键入 ](右括号)。 进入包管理器后,需要输入以下命令 −

(@v1.5) pkg> add DataFrames
   Updating registry at `C:\Users\Leekha\.julia\registries\General`
  Resolving package versions...
Updating `C:\Users\Leekha\.julia\environments\v1.5\Project.toml`
   [a93c6f00] + DataFrames v0.21.7
No Changes to `C:\Users\Leekha\.julia\environments\v1.5\Manifest.toml`

上面的命令会将DataFrames包添加到Julia的环境中。 提示中的 (@v1.5) 告诉我们我们正在默认项目 "v1.5", in ~/.julia/environments/ 中工作。

使用模块

安装后,就可以开始使用已安装模块中的函数和定义了。 为此,我们需要告诉 Julia 编程语言为我们当前的会话提供代码。 使用 using 语句将接受一个或多个已安装模块的名称。

示例

julia> using DataFrames
[ Info: Precompiling DataFrames 

[a93c6f00-e57d-5684-b7b6-d8193f3e46c0]
julia> empty_df = DataFrame(X = 1:10, Y = 21:30)
10×2 DataFrame
│ Row │ X     │ Y     │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│  1  │  1    │   21  │
│  2  │  2    │   22  │
│  3  │  3    │   23  │
│  4  │  4    │   24  │
│  5  │  5    │   25  │
│  6  │  6    │   26  │
│  7  │  7    │   27  │
│  8  │  8    │   28  │
│  9  │  9    │   29  │
│  10 │ 10    │   30  │

Import

像using一样,import也可以用于模块。 唯一的区别是 import 让您决定如何访问模块内的函数。 在下面的示例中,我们在一个模块中有两个不同的函数。 让我们看看如何导入它们 −

示例

julia> module first_module
      export foo1
      
      function foo1()
         println("this is first function")
      end
      
      function foo2()
         println("this is second function")
      end
      
      end
Main.first_module

现在我们需要使用import来导入这个模块 −

julia> import first_module

julia> foo1()
ERROR: foo1 not defined

julia> first_module.foo1()
"this is first function"

您可以注意到,函数 foo1() 仅当与模块前缀一起使用时才能访问。 这是因为first_module是使用import命令加载的,而不是using命令。

Include

如果您想使用模块中未包含的其他文件中的代码怎么办? 为此,您可以使用 include() 函数,它将在当前模块的上下文中评估文件的内容。 它将搜索调用它的源文件的相对路径。

软件包

在 Julia 软件包环境中使用 status 命令查看已安装的所有软件包。

(@v1.5) pkg> status
Status `C:\Users\Leekha\.julia\environments\v1.5\Project.toml`
   [336ed68f] CSV v0.7.7
   [a93c6f00] DataFrames v0.21.7
   [864edb3b] DataStructures v0.18.6
   [7806a523] DecisionTree v0.10.10
   [38e38edf] GLM v1.3.10
   [28b8d3ca] GR v0.52.0
   [86223c79] Graphs v0.10.3
   [7073ff75] IJulia v1.21.3
   [682c06a0] JSON v0.21.1
   [91a5bcdd] Plots v1.6.8
   [d330b81b] PyPlot v2.9.0
   [ce6b1742] RDatasets v0.6.10
   [3646fa90] ScikitLearn v0.6.2
   [f3b207a7] StatsPlots v0.14.13
   [b8865327] UnicodePlots v1.3.0
   [112f6efa] VegaLite v1.0.0

包的结构

众所周知,Julia 使用 git 来组织和控制包。 所有包都以 .ji 前缀存储。 让我们看看 Calculus 包的结构 −

Calculus.jl/
   src/
      Calculus.jl
         module Calculus
            import Base.ctranspose
            export derivative, check_gradient,
            ...
            include("derivative.jl")
            include("check_derivative.jl")
            include("integrate.jl")
         end
      derivative.jl
         function derivative()
            ...
         end
            ...
      check_derivative.jl
         function check_derivative(f::...)
            ...
         end
            ...
      integrate.jl
         function adaptive_simpsons_inner(f::Funct
            ...
         end
         ...
      symbolic.jl
         export processExpr, BasicVariable, ...
         import Base.show, ...
         type BasicVariable <: AbstractVariable
            ...
         end
         function process(x::Expr)
            ...
         end
         ...
      test/
         runtests.jl
            using Calculus
            using Base.Test
            tests = ["finite_difference", ...
            for t in tests
               include("$(t).jl")
            end
            ...
         finite_difference.jl
            @test ...
            ...