Julia REPL tells me that the output of
'c'+2
is 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
but that the output of
'c'+2-'a'
is 4
.
I'm fine with the fact that Chars are identified as numbers via their ASCII code. But I'm confused about the type inference here: why is the first output a char and the second an integer?
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:
c - '0'
to convert char to its decimal representation if you know char is a digit;'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.