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

Julia:能否通过字段名指定用户自定义类型的初始化顺序?

在Julia 0.4.7中实现按字段名初始化自定义类型的方法

嘿,刚好能解决你的疑问!在Julia 0.4.7这个版本里,直接在new()里用x2 = y这种关键字参数初始化是不支持的——new()要求严格按照类型定义的字段顺序传入位置参数,没法直接指定字段名。不过咱们可以通过给构造函数添加关键字参数的方式,实现你想要的“不依赖参数顺序、按字段名初始化”的效果,下面分两种情况说明:

1. 内构造函数实现关键字参数初始化

你可以在内构造函数里定义关键字参数,然后在函数内部按字段定义的顺序把参数传给new():

type MyType
    x1
    x2
    # 用分号标记关键字参数,支持默认值
    MyType(;x1=0, x2=0) = new(x1, x2)
end

调用的时候就可以完全不用管顺序:

# 按任意顺序传入字段名和值
obj1 = MyType(x2=5, x1=3)
obj2 = MyType(x1=10) # 没传的字段用默认值0

2. 外构造函数实现关键字参数初始化

如果你的类型已经有基础构造函数(比如默认的按顺序构造),可以通过外构造函数封装关键字参数逻辑:

# 先定义基础类型(不带自定义内构造的话,默认会生成按字段顺序的构造函数)
type MyType
    x1
    x2
end

# 外构造函数,支持关键字参数
MyType(;x1=0, x2=0) = MyType(x1, x2)

# 甚至可以实现你构想的那种“参数对应特定字段”的逻辑
MyType(a, b) = MyType(x1=b, x2=a) # 这里a对应x2,b对应x1

这样调用MyType(2, 3)就会得到x1=3, x2=2的实例,而调用MyType(x2=2, x1=3)也能得到同样的结果。

简单总结下:核心思路就是用关键字参数作为构造函数的入口,再在构造函数内部把参数按字段定义顺序传给new()或基础构造函数,以此绕过new()不支持关键字参数的限制。

内容的提问来源于stack exchange,提问作者AlQuemist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:49:56