模块系统 #

一、模块基础 #

1.1 定义模块 #

julia
module MyModule

export greet, add

greet(name) = println("Hello, $name!")
add(a, b) = a + b

_internal(x) = x * 2

end

1.2 使用模块 #

julia
using .MyModule

greet("Julia")
add(1, 2)

1.3 导入模块 #

julia
import .MyModule: greet, add

greet("Julia")
add(1, 2)

二、导入与导出 #

2.1 export #

export使名称在使用using时可用:

julia
module Shapes

export Circle, Rectangle, area

struct Circle
    radius::Float64
end

struct Rectangle
    width::Float64
    height::Float64
end

area(c::Circle) = π * c.radius^2
area(r::Rectangle) = r.width * r.height

end

2.2 using #

using导入所有导出的名称:

julia
using .Shapes

c = Circle(5.0)
area(c)

2.3 import #

import导入特定名称:

julia
import .Shapes: Circle, area

c = Circle(5.0)
area(c)

2.4 限定访问 #

使用模块名限定访问:

julia
c = Shapes.Circle(5.0)
Shapes.area(c)

三、模块嵌套 #

3.1 嵌套模块 #

julia
module Outer

export outer_func

outer_func() = println("Outer function")

module Inner

export inner_func

inner_func() = println("Inner function")

end

end

3.2 访问嵌套模块 #

julia
using .Outer
using .Outer.Inner

outer_func()
inner_func()

四、标准库模块 #

4.1 常用标准库 #

julia
using LinearAlgebra
using Statistics
using Random
using Printf
using Dates
using DelimitedFiles
using Serialization

4.2 LinearAlgebra #

julia
using LinearAlgebra

A = [1 2; 3 4]
det(A)
inv(A)
eigvals(A)

4.3 Statistics #

julia
using Statistics

data = [1, 2, 3, 4, 5]
mean(data)
std(data)
median(data)

4.4 Random #

julia
using Random

Random.seed!(42)
rand(5)
randn(5)
shuffle([1, 2, 3, 4, 5])

4.5 Printf #

julia
using Printf

@printf("Integer: %d\n", 42)
@printf("Float: %.2f\n", 3.14159)
@printf("String: %s\n", "Julia")

4.6 Dates #

julia
using Dates

now()
today()
Date(2024, 1, 1)
DateTime("2024-01-01T12:00:00")

五、模块最佳实践 #

5.1 模块结构 #

julia
module MyPackage

using PackageA
using PackageB

import Base: show

export public_func, PublicType

const CONSTANT = 100

struct PublicType
    field::Int
end

function public_func(x)
    _private_helper(x)
end

function _private_helper(x)
    x * 2
end

end

5.2 导入顺序 #

julia
module MyModule

using StandardLibrary
using ThirdPartyPackage

import Base: show

export public_api

end

5.3 避免命名冲突 #

julia
module MyModule

import Base: show

show(io::IO, x::MyType) = ...

end

六、实践练习 #

6.1 练习1:数学工具模块 #

julia
module MathTools

export fibonacci, is_prime, factorial

fibonacci(n::Int) = n <= 1 ? n : fibonacci(n-1) + fibonacci(n-2)

function is_prime(n::Int)
    n < 2 && return false
    for i in 2:isqrt(n)
        n % i == 0 && return false
    end
    return true
end

function factorial(n::Int)
    n < 0 && error("n must be non-negative")
    n <= 1 ? 1 : n * factorial(n - 1)
end

end

using .MathTools

fibonacci(10)
is_prime(17)
factorial(5)

6.2 练习2:字符串工具模块 #

julia
module StringUtils

export reverse_words, word_count, is_palindrome

function reverse_words(s::String)
    join(reverse(split(s)), " ")
end

function word_count(s::String)
    length(split(s))
end

function is_palindrome(s::String)
    cleaned = lowercase(replace(s, r"\W" => ""))
    cleaned == reverse(cleaned)
end

end

using .StringUtils

reverse_words("Hello World")
word_count("Hello World Julia")
is_palindrome("A man, a plan, a canal: Panama")

6.3 练习3:配置模块 #

julia
module Config

export get_config, set_config!, load_config!

const _config = Dict{Symbol, Any}()

function get_config(key::Symbol, default=nothing)
    get(_config, key, default)
end

function set_config!(key::Symbol, value)
    _config[key] = value
end

function load_config!(dict::Dict)
    merge!(_config, dict)
end

function list_config()
    copy(_config)
end

end

using .Config

set_config!(:host, "localhost")
set_config!(:port, 8080)
get_config(:host)
list_config()

七、总结 #

本章我们学习了:

  1. 模块定义:module和end
  2. 导入导出:using、import、export
  3. 模块嵌套:嵌套模块结构
  4. 标准库模块:LinearAlgebra、Statistics等
  5. 最佳实践:模块结构和命名冲突

接下来让我们学习Julia的包管理!

最后更新:2026-03-27