Julia参数类型中数值的类型标注及限制方法咨询
问题解答
修正后的可运行代码及说明
using StaticArrays struct MT{N<:Integer, Np1<:Integer} x::SVector{N, Int} y::SVector{Np1, Int} function MT(x::SVector{N, Int}, y::SVector{Np1, Int}) where {N<:Integer, Np1<:Integer} if Np1 != N + 1 throw(ArgumentError("mismatched lengths; y must be one element longer than x")) end new{N, Np1}(x, y) end end # 合法测试:y长度比x长1 mt_valid = MT(SVector{3, Int}(1,2,3), SVector{4, Int}(1,2,3,4)) println(mt_valid) # 非法测试1:长度不匹配(执行会抛出错误) # MT(SVector{3, Int}(1,2,3), SVector{3, Int}(1,2,3)) # 非法测试2:非整数类型参数(编译阶段直接报错) # MT{1.0, 2.0}(SVector{1, Int}(1), SVector{2, Int}(1,2))
问题1解答
可以在where子句中为类型参数添加约束标注,写法为where {N<:Integer, Np1<:Integer},直接指定参数必须属于整数类型范畴,这同时也解决了你的第二个问题。
问题2解答
通过在结构体定义和构造函数的where子句中添加<:Integer约束,就能强制限制N和Np1必须是整数类型。比如尝试创建MT{1.0, 2.0}会直接在编译阶段报错,因为1.0不属于整数类型,完全符合你“允许MT{1,1},但不允许MT{1.0, 1.0}”的要求。
另外修正了你原代码中的逻辑错误:原构造函数里的Val{T}() == Val{V}()是判断长度相等,但你的错误信息明确要求y比x长1,因此改成了Np1 != N + 1的检查逻辑,确保符合需求。
内容的提问来源于stack exchange,提问作者하현욱
相关产品推荐
相关产品推荐

