Widać to przy stosowaniu float
do przedziału:
julia> 1:10
1:10
julia> float(1:10)
1.0:1.0:10.0
a ta promocja jest wymagane przed dodaniem do Float64 4/1
(4.0
).
Podobnie, podczas dodawania liczbę całkowitą do Julia pływaka "promuje" liczbę całkowitą do pływaka przed dodanie/odjęcie:
julia> 1 + 2.0
3.0
julia> @which 1 + 2.0
+(x::Number, y::Number) at promotion.jl:172
zobaczyć the promotion rules:
+(x::Number, y::Number) = +(promote(x,y)...)
Można @which
wykonaj funkcję połączenia od końca do końca, aby zrozumieć, co się dzieje (aż do the following):
julia> @which +(1:10, 2.0)
+(A::AbstractArray{T,N}, x::Number) at arraymath.jl
julia> @which .+(1:10, 2.0)
.+(r::Range{T}, x::Real) at range.jl
julia> @which .+(2.0, 1:10)
.+(x::Real, r::UnitRange{T<:Real}) at range.jl
# which is defined as
.+(x::Real, r::UnitRange) = range(x + r.start, length(r))
i tym samym promocja-dodanie Int64 i Float64.
Uwaga master wyświetlacz interwału jest nieco mniej kłopotliwe/dwuznaczny:
julia> float(1:10)
10-element FloatRange{Float64}:
1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0
julia> 1:10
10-element UnitRange{Int64}:
1,2,3,4,5,6,7,8,9,10
dobre wytłumaczenie, dzięki! –
To prawdopodobnie tylko literówka, ale nie jest prawdą, że '1:10 === 1: 1: 10', tylko że' 1:10 == 1: 1: 10'. Pierwszy to "UnitRange", a drugi to "StepRange". Warto również wspomnieć, że 'isa (1: 10, AbstractVector) # => true'. –
Dzięki @Andreas za komentarz na temat "1:10! == 1: 1: 10" naprawdę to był literówka, edytuję to. teraz '1:10 == 1: 1: 10 # => prawda' –