Julia中是否可以声明指向任意结构体的通用引用?
问题原因
UndefVarError(:UNKNOWNTYPE)报错的根因是参数化结构体的内部构造函数写法不符合Julia语法规范:在构造函数名Foo2{UNKNOWNTYPE}中直接使用了未绑定的类型参数UNKNOWNTYPE,此时该参数还未和输入的具体类型关联,会被识别为未定义变量。- 额外的隐性问题:
Foo1结构体要求ia字段为Int类型,未设置默认值,直接调用Foo1()不传参数也会触发构造错误。
实现方案
Julia的参数化结构体本身就原生支持你需要的「通用引用」功能,参数类型可以在构造实例时(即运行阶段)动态确定,且不会引入额外运行时性能开销。你可以根据需求选择以下两种写法:
写法1:使用默认自动生成的构造函数(最简便)
如果不需要自定义构造逻辑,直接省略内部构造函数即可,Julia会自动为参数化结构体生成支持类型推断的构造方法:
struct Foo1 ia :: Int end struct Foo2{UNKNOWNTYPE} ref :: UNKNOWNTYPE ib :: Int end # 构造实例 foo1 = Foo1(0) # 给ia字段传入Int类型值 # 方式1:显式指定ref的类型 foo2 = Foo2{Foo1}(foo1, 1) # 方式2:让Julia自动推断ref的类型,不需要手动写类型参数 foo2_auto = Foo2(foo1, 1)
写法2:自定义内部构造函数
如果你需要在构造时添加自定义逻辑,可以用where子句绑定类型参数,正确的写法如下:
struct Foo1 ia :: Int end struct Foo2{UNKNOWNTYPE} ref :: UNKNOWNTYPE ib :: Int # 用where子句绑定类型参数 function Foo2(ref::UNKNOWNTYPE, ib::Int) where UNKNOWNTYPE # 此处可添加自定义构造逻辑 new{UNKNOWNTYPE}(ref, ib) end end foo1 = Foo1(0) foo2 = Foo2(foo1, 1)
两种写法都可以满足通用引用需求,Foo2的ref字段可以存放任意类型的对象,类型在构造实例时动态确定,完全符合预期。
内容的提问来源于stack exchange,提问作者roy.atlas
相关产品推荐
相关产品推荐

