JuliaLang/julia

unary `+` acts differently for `Array` and `AbstractArray`

Open

#58.295 aberto em 1 de mai. de 2025

Ver no GitHub
 (7 comments) (2 reactions) (0 assignees)Julia (5.773 forks)batch import
arraysdesigngood first issue

Métricas do repositório

Stars
 (48.709 stars)
Métricas de merge de PR
 (Mesclagem média 23d 11h) (145 fundiu PRs em 30d)

Description

(This issue is tangentially related to #58281.)

The return type of unary + with Bool argument is not the same for arrays and views:

julia> v = [true, false]; +v
2-element Vector{Int64}:
 1
 0

julia> w = view(v, :); +w
2-element view(::Vector{Bool}, :) with eltype Bool:
 1
 0

The reason is that unary + for AbstractArray is simply the identity map:

https://github.com/JuliaLang/julia/blob/748775b5689deaa4acac7929e0a31a80d1c564f4/base/abstractarraymath.jl#L285

Hence it misses the convention that + transforms Bool to Int.

Another consequence of this definition is that one doesn't know whether +v is identical to v for mutable v:

julia> v = [1, 2]; +v === v
false

julia> w = view(v, :); +w === w
true

In my opinion, it would be good to have a consistent answer. However, it may be to late for that.

Guia do colaborador