如何将Julia参数化类型的参数范围约束为整数值?
约束Julia参数化类型的整数参数
直接在类型定义中添加类型约束
最直接的方式是在where从句里限定N的类型为Integer的子类型,从类型层面限制参数必须是整数类型的实例,编译阶段就能捕获非法类型的参数:
struct InverseTaylor{N<:Integer} a::Vector{Float64} function InverseTaylor{N}() where {N<:Integer} a = something_done_with_n(N) new(a) end end
比如尝试用非整数参数InverseTaylor{3.14}()时,编译器会直接报错,无需等到运行时。
结合构造函数添加更严格的数值约束
如果需要进一步限制N的数值范围(比如必须是正整数),可以在内部构造函数中补充检查逻辑,配合类型约束实现双重保障:
struct InverseTaylor{N<:Integer} a::Vector{Float64} function InverseTaylor{N}() where {N<:Integer} N > 0 || error("N必须是正整数,传入值为$N") a = something_done_with_n(N) new(a) end end
提供友好的外部构造函数
为避免用户手动指定类型参数的繁琐,可额外定义一个接受整数参数的外部构造函数,自动推导类型参数:
struct InverseTaylor{N<:Integer} a::Vector{Float64} function InverseTaylor{N}() where {N<:Integer} N > 0 || error("N必须是正整数,传入值为$N") a = something_done_with_n(N) new(a) end end # 外部构造函数,直接接受整数参数 InverseTaylor(n::Integer) = InverseTaylor{n}()
用户只需调用InverseTaylor(5)即可创建实例,无需手动写InverseTaylor{5}(),同时也保证了参数的合法性。
内容的提问来源于stack exchange,提问作者KeithWM
相关产品推荐
相关产品推荐

