Julia中如何为结构体属性设置最小值、最大值取值约束
Julia 结构体属性取值约束实现方案
你可以通过自定义内部构造函数的方式,在实例化Field结构体时校验min、max的取值是否符合要求,具体实现如下:
不可变结构体实现(你当前定义的不可变struct场景)
修改你的结构体定义,添加内部构造逻辑做参数校验:
struct Field <: AbstractModel type::Type default::String description::String min::Int max::Int # 自定义内部构造函数,添加参数校验规则 function Field(type::Type, default::String, description::String, min::Int, max::Int) # 校验最小值不低于0 if min < 0 throw(ArgumentError("min属性取值不能小于0,当前传入值为 $min")) end # 校验最大值不超过10 if max > 10 throw(ArgumentError("max属性取值不能大于10,当前传入值为 $max")) end # 额外补充合理性校验:最小值不能大于最大值 if min > max throw(ArgumentError("min属性取值不能大于max属性,当前min=$min, max=$max")) end # 校验通过后生成实例 new(type, default, description, min, max) end end
效果测试
- 合法实例化示例:
Field(Int, "0", "测试字段", 0, 10)可正常创建实例 - 非法实例化示例:
Field(Int, "0", "测试字段", -1, 11)会直接抛出ArgumentError异常,中断实例创建
可变结构体扩展实现(如果使用mutable struct允许修改属性)
如果你后续需要修改min、max属性,且修改时也需要遵守取值约束,可以重载Base.setproperty!方法:
mutable struct Field <: AbstractModel type::Type default::String description::String min::Int max::Int # 内部构造函数和不可变场景一致,负责实例化时校验 function Field(type::Type, default::String, description::String, min::Int, max::Int) if min < 0 throw(ArgumentError("min属性取值不能小于0,当前传入值为 $min")) end if max > 10 throw(ArgumentError("max属性取值不能大于10,当前传入值为 $max")) end if min > max throw(ArgumentError("min属性取值不能大于max属性,当前min=$min, max=$max")) end new(type, default, description, min, max) end end # 重载属性赋值方法,修改属性时触发校验 function Base.setproperty!(f::Field, name::Symbol, value) if name == :min value < 0 && throw(ArgumentError("min属性取值不能小于0,当前传入值为 $value")) value > f.max && throw(ArgumentError("min属性取值不能大于当前max值$(f.max)")) elseif name == :max value > 10 && throw(ArgumentError("max属性取值不能大于10,当前传入值为 $value")) value < f.min && throw(ArgumentError("max属性取值不能小于当前min值$(f.min)")) end # 校验通过后完成赋值 setfield!(f, name, value) end
效果测试
实例化后执行f.max = 11会直接抛出异常,无法完成赋值。
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

