x=“abcd”
last(x)==“d”
This is giving me false as output, can anybody explain why??
Unfortunately == allows comparing objects with different types, so you are accidentally comparing the Char 'd' to the String "d".
julia> last("abcd") == 'd'
true
You can get the string version by passing 1 to last.
julia> last("abcd",1) == "d"
true
3 Likes
Thanks ![]()
To explain why this happens: == falls back to === for comparisons, which has a default fallback of false for objects of different types (they’re differently typed objects after all and as such cannot be the exact same thing).
1 Like
Is it a mistake to define it as such? Should it be defined as:
julia> import Base.==
julia> ==(C::AbstractChar, S::AbstractString) = S == string(C)
julia> ==(S::AbstractString, C::AbstractChar) = S == string(C)
julia> last(x)=="d"
true
And note, in contrast, this will allocate for the String returned:
julia> @time last("abcd",1) == "d"
0.000004 seconds (1 allocation: 32 bytes)
true
I thought my version would also allocate because of string, and I was going to amend it, but actually it doesn’t, at least on 1.7.3. I guess the compiler is just clever.