Nothing类型 #

一、Nothing类型 #

1.1 nothing值 #

nothingNothing类型的唯一实例:

julia
nothing
typeof(nothing)

1.2 用途 #

nothing通常用于:

  • 表示"没有值"
  • 函数没有有意义的返回值
  • 可选参数的默认值
julia
function print_greeting(name)
    println("Hello, $name!")
    return nothing
end

result = print_greeting("Julia")
result === nothing

1.3 检查nothing #

julia
x = nothing
x === nothing
isnothing(x)
x == nothing

1.4 Nothing与类型 #

julia
Union{Int, Nothing}
Union{String, Nothing}

二、可选返回值 #

2.1 返回nothing #

julia
function find_first(arr, predicate)
    for (i, x) in enumerate(arr)
        if predicate(x)
            return i
        end
    end
    return nothing
end

find_first([1, 2, 3, 4, 5], x -> x > 3)
find_first([1, 2, 3, 4, 5], x -> x > 10)

2.2 处理可选返回值 #

julia
result = find_first([1, 2, 3], x -> x > 10)

if result !== nothing
    println("Found at index: $result")
else
    println("Not found")
end

result = find_first([1, 2, 3], x -> x > 2)
result !== nothing && println("Found at index: $result")

2.3 get函数模式 #

julia
function get_value(dict, key, default=nothing)
    haskey(dict, key) ? dict[key] : default
end

d = Dict(:a => 1, :b => 2)
get_value(d, :a)
get_value(d, :c)
get_value(d, :c, 0)

三、Missing类型 #

3.1 missing值 #

missing表示缺失值,来自Missings模块:

julia
missing
typeof(missing)

3.2 missing传播 #

missing会在运算中传播:

julia
1 + missing
missing + 1
[1, 2, missing, 4]
sum([1, 2, missing, 4])

3.3 检查missing #

julia
ismissing(missing)
ismissing(nothing)
ismissing(0)
missing === missing

3.4 跳过missing #

julia
using Statistics

arr = [1, 2, missing, 4, 5]
skipmissing(arr) |> collect
mean(skipmissing(arr))
sum(skipmissing(arr))

3.5 替换missing #

julia
using Missings

arr = [1, 2, missing, 4, 5]
coalesce.(arr, 0)
replace(arr, missing => 0)

四、Nothing vs Missing #

4.1 区别 #

特性 nothing missing
类型 Nothing Missing
用途 表示"没有值" 表示"缺失值"
运算传播 不传播 传播
典型场景 可选返回值 数据分析

4.2 选择 #

  • 使用nothing:程序逻辑中的"无值"
  • 使用missing:数据分析中的"缺失值"
julia
function find_item(arr, condition)
    for x in arr
        condition(x) && return x
    end
    return nothing
end

data = [1.0, 2.0, missing, 4.0, 5.0]
mean(skipmissing(data))

五、Union类型 #

5.1 定义Union #

julia
IntOrNothing = Union{Int, Nothing}
StringOrNothing = Union{String, Nothing}
Optional{T} = Union{T, Nothing}

5.2 类型检查 #

julia
x = 10
x isa Union{Int, Nothing}
x = nothing
x isa Union{Int, Nothing}

5.3 函数参数 #

julia
function process(x::Union{Int, Nothing})
    if x === nothing
        return "No value"
    else
        return x * 2
    end
end

process(10)
process(nothing)

六、实践练习 #

6.1 练习1:安全除法 #

julia
function safe_divide(a, b)
    b == 0 ? nothing : a / b
end

safe_divide(10, 2)
safe_divide(10, 0)

6.2 练习2:查找元素 #

julia
function find_index(arr, value)
    for (i, x) in enumerate(arr)
        x == value && return i
    end
    return nothing
end

find_index([1, 2, 3, 4, 5], 3)
find_index([1, 2, 3, 4, 5], 10)

6.3 练习3:处理缺失数据 #

julia
using Statistics

function analyze_data(data)
    clean_data = collect(skipmissing(data))
    if isempty(clean_data)
        return nothing
    end
    return (
        count = length(clean_data),
        mean = mean(clean_data),
        std = std(clean_data)
    )
end

data = [1.0, 2.0, missing, 4.0, 5.0]
analyze_data(data)
analyze_data([missing, missing])

6.4 练习4:可选配置 #

julia
struct Config
    host::String
    port::Int
    timeout::Union{Float64, Nothing}
end

function connect(config::Config)
    timeout = config.timeout === nothing ? 30.0 : config.timeout
    println("Connecting to $(config.host):$(config.port) with timeout $timeout")
end

connect(Config("localhost", 8080, nothing))
connect(Config("localhost", 8080, 10.0))

七、总结 #

本章我们学习了:

  1. Nothing类型:nothing值和用途
  2. 可选返回值:使用nothing表示无结果
  3. Missing类型:缺失值和传播特性
  4. Union类型:组合类型和可选参数
  5. 空值处理:检查和处理空值

接下来让我们学习Julia的数据结构!

最后更新:2026-03-27