julia 中变量后面的{常量}是什么意思?

问题描述 投票:0回答:2

变量名后面的这个{M}是什么意思?

我在代码中看到过这样的东西:

结构体名称{M}

我想知道这个 {M} 对我们的代码做了什么?

variables struct julia
2个回答
2
投票

这允许传递和操作在编译时而不是运行时可用的数字。这可用于动态构造数据结构,稍后 Julia 可以为它们高效地编译代码。

考虑这个结构:

Base.@kwdef struct AA{M}
    a::Array{Int, M} = rand(0:99, fill(3,M)...)
end

字段

a
的维数与类型信息一起存储。 这可以用作:

julia> AA{1}()
AA{1}([70, 46, 20])

julia> AA{2}()
AA{2}([81 73 38; 65 50 77; 57 87 66])

请注意,

M
是类型定义的一部分,因此知道
M
,编译器就知道底层字段的类型:

julia> fieldtypes(AA{1})
(Vector{Int64},)

julia> fieldtypes(AA{2})
(Matrix{Int64},)

julia> fieldtypes(AA{3})
(Array{Int64, 3},)

与宏(在编译时转换代码的程序)结合使用时,此行为特别有用。虽然宏显然无法访问变量中的值,但它们可以充分利用数字参数类型,例如

M
。 一个很好的应用示例是https://github.com/JuliaArrays/StaticArrays.jl,当先验地知道向量/数组大小可以产生更高效的机器代码时。


1
投票

在 Julia 中,花括号 (

{}
) 用于用特定值或类型参数化变量或类型。例如,名为
x{3}
的变量使用值 3 进行参数化,而
Struct name{M}
表示名称结构体使用类型 M 进行参数化。

© www.soinside.com 2019 - 2024. All rights reserved.