如何在 Julia 中创建特定类型的空元组?

dot*_*dot 3 struct tuples julia

如何使用特定类型的空元组初始化可变结构?

例如给定

mutable struct myStruct
    info::Tuple{Int, Int}
end
Run Code Online (Sandbox Code Playgroud)

我将如何创建一个变量x = myStruct(info = ())

x.info空元组在哪里?typeof(x.info) = Tuple{Int, Int}

Mar*_*kul 8

简而言之,您不能创建类型为空的元组Tuple{Int,Int}。根据定义,aTuple{Int, Int}的长度为 2,因此不为空。

将此与Array{Int}长度为 0 的空值进行比较,因此为空:

julia> empty_array = Int[]
Int64[]

julia> isempty(empty_array)
true

julia> length(empty_array)
0
Run Code Online (Sandbox Code Playgroud)

长答案是这取决于你所说的“空”是什么意思。也许您的意思是不需要初始化的东西。我们可以使用Ref. 在这种情况下,这些值将是内存中驻留的任何值。总的来说,我不确定这与仅将元组初始化为 相比有什么优势(0,0)

julia> r = Ref{Tuple{Int,Int}}()
Base.RefValue{Tuple{Int64, Int64}}((2, 139735268818544))

julia> r = Ref{Tuple{Int,Int}}()
Base.RefValue{Tuple{Int64, Int64}}((139735268745904, 139735268746800))

julia> isempty(r[])
false
Run Code Online (Sandbox Code Playgroud)

总的来说,我不清楚为什么你想要一个空元组而不是作为默认myStruct构造函数的默认初始值。

对于默认构造函数,我建议使用(0,0)以下值作为初始值:

julia> mutable struct myStruct
           info::Tuple{Int, Int}
       end

julia> myStruct() = myStruct((0,0))
myStruct

julia> myStruct()
myStruct((0, 0))
Run Code Online (Sandbox Code Playgroud)

我对为什么你可能想要一个“空”元组的最后一个猜测是为了避免分配。创建myStruct实例会分配 32 字节。为了避免分配,最好的做法是使结构不可变。这样做有很多优点,例如简化的内存布局涉及更少的指针间接。它还允许编译器做出简化的假设,从而产生更快的代码。

julia> @time myStruct();
  0.000001 seconds (1 allocation: 32 bytes)

julia> struct NonAllocatingStruct
           info::Tuple{Int, Int}
       end

julia> NonAllocatingStruct() = NonAllocatingStruct((0,0))
NonAllocatingStruct

julia> @time NonAllocatingStruct()
  0.000002 seconds
NonAllocatingStruct((0, 0))
Run Code Online (Sandbox Code Playgroud)