Julia中如何为函数参数设置值范围约束?
在Julia里按参数值范围定义函数重载的办法
完全可以实现类似Mathematica那种按参数值范围匹配函数逻辑的需求,Julia有几种实用的方式,下面介绍最常用的两种:
1. 函数里直接加分支判断(简单省心)
这是最直接的方式,在同一个函数里用if-else判断参数值的范围,执行不同逻辑:
function addition(x::Real, y::Real) if 1.0 ≤ x ≤ 15.0 && 1.0 ≤ y ≤ 15.0 return x + y elseif x > 15.0 return x * y + 10 # 超出x上限的实现 else return x + 2y # 其他情况的默认逻辑 end end
这种方式不用额外折腾,适合简单的范围判断场景。
2. 自定义类型封装范围(真正的重载)
如果想要严格的方法重载——也就是不同范围对应不同的函数方法,可以用自定义类型把特定范围的值包起来,利用Julia的多重派发机制来实现:
第一步:定义范围类型
# 定义一个类型,用来表示落在[L,U]范围内的数值 struct InRange{T<:Real, L, U} <: Real value::T end # 构造函数,自动检查输入值是否在指定范围内 InRange{T,L,U}(x::T) where {T<:Real, L, U} = L ≤ x ≤ U ? new(x) : error("值 $x 不在 [$L,$U] 范围内") # 让这个自定义类型能像普通数值一样用(支持转换、运算等) Base.convert(::Type{T}, r::InRange{T,L,U}) where {T,L,U} = r.value Base.promote_rule(::Type{InRange{T,L,U}}, ::Type{S}) where {T,S,L,U} = promote_type(T,S) Base.:+(r::InRange, s::InRange) = r.value + s.value
第二步:定义重载的函数方法
# 专门给1.0-15.0范围的数值写的addition方法 addition(x::InRange{<:Real,1.0,15.0}, y::InRange{<:Real,1.0,15.0}) = x + y # 给普通实数(超出范围或没包装的)写的addition方法 addition(x::Real, y::Real) = x * y + 10
用起来是这样的
# 调用匹配范围的方法 addition(InRange{Float64,1.0,15.0}(5.0), InRange{Float64,1.0,15.0}(10.0)) # 返回15.0 # 调用普通实数的方法 addition(20.0, 5.0) # 返回20*5+10=110
额外小技巧:用第三方包简化
要是不想自己写自定义类型,也可以用Match.jl包的模式匹配功能,语法和Mathematica更像:
using Match function addition(x, y) @match (x, y) begin (x, y) where 1.0 ≤ x ≤15.0 && 1.0 ≤ y ≤15.0 => x + y (x, y) where x >15.0 => x*y +10 _ => x + 2y end end
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

