Julia子类型及构造器逻辑不理解,调用map执行validator函数报错求助
问题排查与修正
核心问题梳理
- 自定义结构体
Field5的字段未声明类型,Julia会默认所有字段的类型为Any,和validator函数的校验规则直接冲突。你的校验逻辑要求第3、4、5个字段分别是String、Int、Int子类型,但Any不属于这三个类型的子类型,因此会触发校验报错。 - 你当前定义的
Field5内部构造器完全忽略了传入的参数,硬编码了所有字段的值,不符合自定义结构体的常规使用逻辑,如无特殊需求建议调整。 map(validator, subtypes(AbstractModel))的写法本身没有问题,subtypes返回的就是抽象类型的所有子类型的类型对象,完全符合validator函数的参数要求。
修正后可运行代码
abstract type AbstractModel end function validator(::Type{T}) where {T<:AbstractModel} fieldtype(T,3) <: String || error("Validation error for type of default: Type $T 第3个字段类型不是String") fieldtype(T,4) <: Int || error("Validation error for type of default: Type $T 第4个字段类型不是Int") fieldtype(T,5) <: Int || error("Validation error for type of default: Type $T 第5个字段类型不是Int") return "Validation passed for $T" end struct Field5 <:AbstractModel type::String default::Any # 可根据实际需求替换为具体类型 description::String min::Int max::Int # 常规构造器,保留传入参数 Field5(type, default, description, min, max) = new(type, default, description, min, max) # 如需要默认值构造器可保留下面这行 Field5() = new("", "", "this is description",7,10) end map(validator, subtypes(AbstractModel))
运行上述代码会返回["Validation passed for Field5"],无报错。
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

