返回值 #

一、基本返回值 #

1.1 隐式返回 #

函数返回最后一个表达式的值:

julia
function add(a, b)
    a + b
end

result = add(1, 2)

1.2 显式return #

使用return显式返回:

julia
function add(a, b)
    return a + b
end

1.3 提前返回 #

julia
function divide(a, b)
    b == 0 && return nothing
    return a / b
end

divide(10, 2)
divide(10, 0)

1.4 条件返回 #

julia
function classify(x)
    x > 0 && return "positive"
    x < 0 && return "negative"
    return "zero"
end

classify(5)
classify(-3)
classify(0)

二、多返回值 #

2.1 元组返回 #

使用元组返回多个值:

julia
function minmax(arr)
    return minimum(arr), maximum(arr)
end

min_val, max_val = minmax([1, 2, 3, 4, 5])

2.2 解构赋值 #

julia
function divide_and_remainder(a, b)
    return (div(a, b), a % b)
end

quotient, remainder = divide_and_remainder(10, 3)

2.3 忽略返回值 #

julia
function get_info()
    return "Alice", 25, "New York"
end

name, _, city = get_info()
name
city

三、命名元组返回 #

3.1 基本语法 #

julia
function statistics(arr)
    return (
        count = length(arr),
        sum = sum(arr),
        mean = sum(arr) / length(arr)
    )
end

stats = statistics([1, 2, 3, 4, 5])
stats.count
stats.sum
stats.mean

3.2 解构命名元组 #

julia
function get_user()
    return (name="Alice", age=25, city="NYC")
end

(; name, age) = get_user()
name
age

3.3 可读性优势 #

julia
function analyze_text(text)
    words = split(text)
    return (
        word_count = length(words),
        char_count = length(text),
        avg_word_length = sum(length.(words)) / length(words)
    )
end

result = analyze_text("Hello world from Julia")
result.word_count
result.avg_word_length

四、返回类型注解 #

4.1 基本语法 #

julia
function add(a::Int, b::Int)::Int
    return a + b
end

function greet(name)::String
    return "Hello, $name"
end

4.2 复杂类型 #

julia
function get_stats(arr::Vector{Int})::NamedTuple{(:count, :sum, :mean), Tuple{Int, Int, Float64}}
    return (
        count = length(arr),
        sum = sum(arr),
        mean = sum(arr) / length(arr)
    )
end

4.3 Union返回类型 #

julia
function safe_divide(a::Float64, b::Float64)::Union{Float64, Nothing}
    b == 0 && return nothing
    return a / b
end

safe_divide(10.0, 2.0)
safe_divide(10.0, 0.0)

五、Nothing返回 #

5.1 表示无结果 #

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], 2)
find_index([1, 2, 3], 5)

5.2 处理Nothing #

julia
result = find_index([1, 2, 3], 2)

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

5.3 默认值模式 #

julia
function find_or_default(arr, value, default)
    result = find_index(arr, value)
    return result === nothing ? default : result
end

find_or_default([1, 2, 3], 2, 0)
find_or_default([1, 2, 3], 5, 0)

六、实践练习 #

6.1 练习1:数学运算 #

julia
function quadratic(a, b, c)
    Δ = b^2 - 4*a*c
    if Δ < 0
        return nothing
    elseif Δ == 0
        x = -b / (2a)
        return (x,)
    else
        x1 = (-b + sqrt(Δ)) / (2a)
        x2 = (-b - sqrt(Δ)) / (2a)
        return (x1, x2)
    end
end

quadratic(1, -5, 6)
quadratic(1, 2, 1)
quadratic(1, 1, 1)

6.2 练习2:文件处理 #

julia
function read_file_info(filename)
    try
        stat = stat(filename)
        return (
            exists = true,
            size = stat.size,
            modified = stat.mtime
        )
    catch
        return (exists = false, size = 0, modified = 0.0)
    end
end

read_file_info("existing_file.txt")
read_file_info("nonexistent.txt")

6.3 练习3:解析结果 #

julia
function parse_user_input(input)
    parts = split(input, ",")
    if length(parts) != 3
        return (success = false, error = "Expected 3 fields")
    end
    
    try
        name = strip(parts[1])
        age = parse(Int, strip(parts[2]))
        city = strip(parts[3])
        return (success = true, name = name, age = age, city = city)
    catch e
        return (success = false, error = string(e))
    end
end

parse_user_input("Alice, 25, NYC")
parse_user_input("Invalid input")

6.4 练习4:缓存函数 #

julia
function memoize(f)
    cache = Dict{Tuple, Any}()
    function(args...)
        key = args
        if !haskey(cache, key)
            cache[key] = f(args...)
        end
        return cache[key]
    end
end

fib = memoize(function(n)
    n <= 1 ? n : fib(n-1) + fib(n-2)
end)

fib(40)

七、总结 #

本章我们学习了:

  1. 基本返回值:隐式和显式返回
  2. 多返回值:元组返回和解构
  3. 命名元组返回:可读性更好的返回值
  4. 返回类型注解:指定返回类型
  5. Nothing返回:表示无结果

接下来让我们学习Julia的匿名函数!

最后更新:2026-03-27