在Julia中是否可能声明一个通用的引用任何结构体的变量?

3
我想知道是否可以在结构体内实现一个通用引用。 代码如下:
struct Foo1
  ia :: Int
end


struct Foo2{UNKNOWNTYPE}
  ref :: UNKNOWNTYPE
  ib :: Int
  
  function Foo2{UNKNOWNTYPE}(ref::UNKNOWNTYPE,ib::Int)
    o = new{UNKNOWNTYPE}(ref,ib) 
    return o
  end
end

foo1 = Foo1();
foo2 = Foo2{Foo1}(foo1,1)


在上述代码中,结构体Foo2中变量ref的类型直到运行时才能确定。上述代码无法正常工作,并显示:"LoadError("main.jl", 6, UndefVarError(:UNKNOWNTYPE))"。
1个回答

6
你的构造函数定义中基本上只缺少了where UNKNOWNTYPE。我建议为Foo2使用外部构造函数,像这样:
julia> struct Foo1
         ia::Int
       end

julia> struct Foo2{T}
         ref::T
         ib::Int
       end

julia> Foo2(ref::T, ib::Int) where T = Foo2{T}(ref, ib)
Foo2

julia> Foo2(Foo1(1), 1)
Foo2{Foo1}(Foo1(1), 1)

但是内部构造函数也可以使用:

julia> struct Foo3{T}
         ref::T
         ib::Int

         function Foo3(ref::T, ib::Int) where T
           return new{T}(ref, ib)
         end
       end

julia> Foo3(Foo1(1), 2)
Foo3{Foo1}(Foo1(1), 2)

使用外部构造函数的好处是什么? - roy.atlas
它不会删除默认的内部构造函数,因此您仍然可以执行类似Foo2{Float64}(1,2)的操作。 - pfitzseb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接