range 合并的问题

请教个问题,为什么从大到小的 range 和其他 range 合并会失败,如下

julia> [range(9,4); range(1,3)]
3-element Vector{Int64}:
 1
 2
 3

julia> [range(1,3); range(9,4)]
3-element Vector{Int64}:
 1
 2
 3

julia> [range(1,3); range(2,4)]
6-element Vector{Int64}:
 1
 2
 3
 2
 3
 4

我猜测是 range(9,4) 会返回一个空的 range ,比如 collect(9:4) == Int64[] ,而 collect(range(1, 3)) = [1; 2; 3]。如果你想表达一个反序的 range ,需要加上 step 参数,比如 collect(range(9, 4, step=-1)) == [9, 8, 7, 6, 5, 4]

因此你提出的问题可能可以这样解决:

julia> [range(9, 4, step=-1); range(1, 3)]
9-element Vector{Int64}:
 9
 8
 7
 6
 5
 4
 1
 2
 3

您说的对。我的错,之前看到下面的结果,没仔细看,以为能正常用。但这里显示 9:8 也有些奇怪。

julia> range(9,4)
9:8
julia> UnitRange(9,4)
9:8

julia> Base.unitrange_last(9,4)
8

为什么这样设计,我还没查到。
不过看到定义 unitrange_last = start - 1

1 个赞

这个可以查 gitblame,最早应该是 eliminate 2nd type parameter from UnitRange · JuliaLang/julia@4b1c9d6 · GitHub 不过话说改的次数是真的多