The reason is:
julia> @which 'a' - 1
-(x::T, y::Integer) where T<:AbstractChar in Base at char.jl:227
julia> @which 'a' - 'b'
-(x::AbstractChar, y::AbstractChar) in Base at char.jl:226
Subtraction of Char
and integer is Char
. This is e.g. 'a' - 1
.
However, subtraction of two Char
is integer. This is e.g. 'a' - 'b'
.
Note that for Char
and integer both addition and subtraction are defined, but for two Char
only subtraction works:
julia> 'a' + 'a'
ERROR: MethodError: no method matching +(::Char, ::Char)
This indeed can lead to tricky cases at times that rely of order of operations, as in this example:
julia> 'a' + ('a' - 'a')
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
julia> 'a' + 'a' - 'a'
ERROR: MethodError: no method matching +(::Char, ::Char)
Also note that when working with Char
and integer you cannot subtract Char
from integer:
julia> 2 - 'a'
ERROR: MethodError: no method matching -(::Int64, ::Char)
Motivation:
- subtraction of two char - this is sometimes useful if you want to get a relative position of a char with reference to other char, e.g.
c - '0'
to convert char to its decimal representation if you know char is a digit;
- adding or subtracting an integer and char - the same but in reverse e.g. you want to convert digit to char and write
'0' + d
.
I have been using Julia for years now, and I used this feature maybe once or twice, so I would not say it is super commonly needed.