为什么 Julia Int64、Float64 和布尔值支持 getindex



在Julia中,你可以声明一个Int64Bool或一个Float64,并用1索引它。

julia>  aa = 10
10
julia> typeof(10)
Int64
julia> aa[1]
10
julia> aa[0]
ERROR: BoundsError
Stacktrace:
 [1] getindex(::Int64, ::Int64) at .number.jl:78
 [2] top-level scope at none:0
julia> aa[2]
ERROR: BoundsError
Stacktrace:
 [1] getindex(::Int64, ::Int64) at .number.jl:78
 [2] top-level scope at none:0

此功能的存在是否有实际或理论原因?我从未在我使用过的任何其他语言(Python,Ruby,Matlab,C++)中看到过它。

原因有二:

  1. 数字被朱莉娅视为0维容器。
  2. 如果在getindex中添加1作为维度索引号,则即使1超出容器的维度,也不会出错。

这两个规则相结合会导致您描述的行为。以下是更多相同的示例:

julia> a = 1
1
julia> b = [1,2,3]
3-element Array{Int64,1}:
 1
 2
 3
julia> a[]
1
julia> a[1,1,1,1]
1
julia> b[2,1,1,1,1]
2

请注意,为容器定义的标准函数是为数字定义的,其行为与0维对象相同,例如:

julia> size(a)
()
julia> axes(a)
()

有一个开放的 PR,提供了省略索引和额外索引如何工作的更多详细信息。

相关内容

最新更新