You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:24:04