Skip to content

Commit fbe9c8b

Browse files
authored
StepRange constructor with an OrdinalRange argument (#57718)
The `StepRange` constructor currently doesn't convert from a `StepRange`, but similar calls work with other range types such as `StepRangeLen` and `UnitRange`. ```julia julia> StepRange(2:1:4) ERROR: MethodError: no method matching StepRange(::StepRange{Int64, Int64}) The type `StepRange` exists, but no method is defined for this combination of argument types when trying to construct it. ``` After this PR, it works: ```julia julia> StepRange(2:1:4) 2:1:4 ```
1 parent 3e7cf64 commit fbe9c8b

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

base/range.jl

+4-2
Original file line numberDiff line numberDiff line change
@@ -1321,13 +1321,15 @@ function promote_rule(::Type{StepRange{T1a,T1b}}, ::Type{StepRange{T2a,T2b}}) wh
13211321
el_same(promote_type(T1a, T2a), StepRange{T1a,Tb}, StepRange{T2a,Tb})
13221322
end
13231323
StepRange{T1,T2}(r::StepRange{T1,T2}) where {T1,T2} = r
1324+
StepRange{T}(r::StepRange{T}) where {T} = r
1325+
StepRange(r::StepRange) = r
13241326

13251327
promote_rule(a::Type{StepRange{T1a,T1b}}, ::Type{UR}) where {T1a,T1b,UR<:AbstractUnitRange} =
13261328
promote_rule(a, StepRange{eltype(UR), eltype(UR)})
13271329
StepRange{T1,T2}(r::AbstractRange) where {T1,T2} =
13281330
StepRange{T1,T2}(convert(T1, first(r)), convert(T2, step(r)), convert(T1, last(r)))
1329-
StepRange(r::AbstractUnitRange{T}) where {T} =
1330-
StepRange{T,T}(first(r), step(r), last(r))
1331+
StepRange(r::OrdinalRange{T,S}) where {T,S} = StepRange{T,S}(first(r), step(r), last(r))
1332+
StepRange{T}(r::OrdinalRange{<:Any,S}) where {T,S} = StepRange{T,S}(first(r), step(r), last(r))
13311333
(StepRange{T1,T2} where T1)(r::AbstractRange) where {T2} = StepRange{eltype(r),T2}(r)
13321334
StepRange(r::StepRangeLen) = StepRange{eltype(r)}(r)
13331335
StepRange{T}(r::StepRangeLen{<:Any,<:Any,S}) where {T,S} = StepRange{T,S}(r)

test/ranges.jl

+14
Original file line numberDiff line numberDiff line change
@@ -1299,6 +1299,20 @@ end
12991299
@test convert(StepRange, 0:5) === 0:1:5
13001300
@test convert(StepRange{Int128,Int128}, 0.:5) === Int128(0):Int128(1):Int128(5)
13011301

1302+
@test StepRange(1:1:4) === 1:1:4
1303+
@test StepRange{Int32}(1:1:4) === StepRange{Int32,Int}(1,1,4)
1304+
1305+
struct MyStepRange57718{T,S} <: OrdinalRange{T,S}
1306+
r :: StepRange{T,S}
1307+
end
1308+
Base.first(mr::MyStepRange57718) = first(mr.r)
1309+
Base.last(mr::MyStepRange57718) = last(mr.r)
1310+
Base.step(mr::MyStepRange57718) = step(mr.r)
1311+
Base.length(mr::MyStepRange57718) = length(mr.r)
1312+
1313+
@test StepRange(MyStepRange57718(1:1:4)) === 1:1:4
1314+
@test StepRange{Int32}(MyStepRange57718(1:1:4)) === StepRange{Int32,Int}(1,1,4)
1315+
13021316
@test_throws ArgumentError StepRange(1.1,1,5.1)
13031317

13041318
@test promote(0f0:inv(3f0):1f0, 0.:2.:5.) === (0:1/3:1, 0.:2.:5.)

0 commit comments

Comments
 (0)