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
相关产品推荐
相关产品推荐

