Julia结构体构造函数中new是否支持关键字参数?
问题解答
关于new()是否支持关键字参数
是的,Julia中的new()构造函数确实不支持关键字参数,这是语法层面的限制,所以你直接使用new(bar = "hello", foo = 2)会触发报错。
针对多字段结构体的解决方案
对于有20个字段的结构体,要确保字段赋值对应正确,可以用以下两种常用方法:
方法1:使用Base.@kwdef宏自动生成关键字构造函数
这个宏可以帮你自动生成支持关键字参数的构造函数,无需手动编写大量代码,示例如下:
using Base: @kwdef @kwdef struct MyStruct foo::Number bar::String # 这里可以继续添加你的20个字段 end # 直接用关键字参数创建实例 obj = MyStruct(foo=2, bar="hello")
如果需要在构造时添加自定义逻辑(比如参数校验),也可以在结构体内部定义构造函数,@kwdef会自动兼容:
@kwdef struct MyStruct foo::Number bar::String function MyStruct(foo::Number, bar::String) # 自定义逻辑:比如检查foo是否为正数 foo > 0 || error("foo必须大于0") new(foo, bar) end end # 依然支持关键字调用 obj = MyStruct(foo=2, bar="hello")
方法2:手动编写外层关键字构造函数
如果不想依赖宏,可以手动写一个带关键字参数的外层构造函数,将参数按顺序传递给new():
struct MyStruct foo::Number bar::String # 其他18个字段... # 内部构造函数,按顺序接收参数 function MyStruct(foo::Number, bar::String) new(foo, bar) end end # 外层关键字构造函数,用分号标记关键字参数 MyStruct(; foo::Number, bar::String) = MyStruct(foo, bar) # 使用关键字参数创建实例 obj = MyStruct(foo=2, bar="hello")
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

