Julia中如何在函数内返回struct结构体的新实例
错误原因
- 结构体字段和构造函数参数不匹配:
Field{T}定义了5个字段,你写的内部构造函数仅接收3个参数,且传入new的参数顺序和字段声明顺序完全不一致 - 构造函数参数数量不匹配:你自定义的3参数内部构造函数覆盖了Julia默认生成的多参数构造函数,而
generateField调用时传入了5个参数,找不到对应方法 - 冗余的
type字段:Julia泛型参数T本身已经携带了字段类型信息,不需要额外声明type::T字段存储类型(如果确实有存储类型的需求可以单独保留)
修正后代码
方案1:删除冗余的type字段(推荐)
首先调整结构体定义:
struct Field{T} default::T description::String min::T max::T # 内部构造函数可按需补充参数校验逻辑 function Field{T}(default::T, description::String, min::T, max::T) where {T} # 可选校验规则:min > max ? throw(ArgumentError("min不能大于max")) : nothing new{T}(default, description, min, max) end end # 补充外层构造函数,支持自动推导泛型参数T,无需手动指定 function Field(default::T, description::String, min::T, max::T) where {T} return Field{T}(default, description, min, max) end
然后调整generateField函数:
function generateField(default, description::String, min, max) # 自动推导泛型类型,也可以手动指定类型比如Field{Int}(...) return Field(default, description, min, max) end
使用示例:
# 生成Int类型的Field实例 f1 = generateField(5, "年龄字段", 0, 120) # 生成Float64类型的Field实例 f2 = generateField(36.5, "体温字段", 35.0, 42.0)
方案2:保留type字段
如果业务逻辑确实需要在结构体里存储类型信息,调整如下:
struct Field{T} type::Type{T} default::T description::String min::T max::T function Field{T}(type::Type{T}, default::T, description::String, min::T, max::T) where {T} new{T}(type, default, description, min, max) end end # 外层自动推导构造 function Field(type::Type{T}, default::T, description::String, min::T, max::T) where {T} return Field{T}(type, default, description, min, max) end
对应的generateField调整:
function generateField(type::Type{T}, default::T, description::String, min::T, max::T) where T return Field(type, default, description, min, max) end
使用示例:
f = generateField(Int, 5, "年龄字段", 0, 120)
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

