Si può vedere questo quando si applica float
ad un intervallo:
julia> 1:10
1:10
julia> float(1:10)
1.0:1.0:10.0
e questa promozione è necessario prima di aggiungere al float64 4/1
(4.0
).
Analogamente, quando si aggiunge un numero intero in una julia float "promuove" il numero intero per un galleggiante prima di aggiungere/sottrarre:
julia> 1 + 2.0
3.0
julia> @which 1 + 2.0
+(x::Number, y::Number) at promotion.jl:172
vedi the promotion rules:
+(x::Number, y::Number) = +(promote(x,y)...)
È possibile @which
seguire la funzione chiama fino in fondo per capire cosa sta succedendo (fino a 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))
e quindi l'aggiunta di promozione di Int64 e Float64.
Nota in master la visualizzazione di intervallo è un po 'meno confusione/ambiguo:
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
buona spiegazione, grazie! –
Probabilmente è solo un refuso, ma non è vero che '1:10 === 1: 1: 10', solo che' 1:10 == 1: 1: 10'. Il primo è un 'UnitRange' e il secondo è un' StepRange'. Potrebbe anche essere utile ricordare che 'isa (1: 10, AbstractVector) # => true'. –
Grazie a @Andreas per il suo commento su '1:10! == 1: 1: 10', in realtà era un refuso, lo modifico. ora '1:10 == 1: 1: 10 # => true' –