Skip to content

Commit df2616e

Browse files
authored
Merge pull request #24963 from JuliaLang/nl/missingtuple
Use three-valued logic with missing values in ==(::Tuple, ::Tuple)
2 parents a9bb7d3 + be38d94 commit df2616e

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

base/tuple.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,16 @@ function ==(t1::Tuple, t2::Tuple)
268268
if length(t1) != length(t2)
269269
return false
270270
end
271+
anymissing = false
271272
for i = 1:length(t1)
272-
if !(t1[i] == t2[i])
273-
return false
274-
end
273+
eq = (t1[i] == t2[i])
274+
if ismissing(eq)
275+
anymissing = true
276+
elseif !eq
277+
return false
278+
end
275279
end
276-
return true
280+
return anymissing ? missing : true
277281
end
278282

279283
const tuplehash_seed = UInt === UInt64 ? 0x77cfa1eef01bca90 : 0xf01bca90

test/missing.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ end
202202
@test Union{Int, Missing}[1] == Union{Float64, Missing}[1.0]
203203
@test Union{Int, Missing}[1] == [1.0]
204204
@test Union{Bool, Missing}[true] == BitArray([true])
205+
@test !([missing, 1] == [missing, 2])
205206
@test !(Union{Int, Missing}[1] == [2])
206207
@test !([1] == Union{Int, Missing}[2])
207208
@test !(Union{Int, Missing}[1] == Union{Int, Missing}[2])
@@ -217,11 +218,26 @@ end
217218
@test !(Union{Int, Missing}[1] != Union{Float64, Missing}[1.0])
218219
@test !(Union{Int, Missing}[1] != [1.0])
219220
@test !(Union{Bool, Missing}[true] != BitArray([true]))
221+
@test [missing, 1] != [missing, 2]
220222
@test Union{Int, Missing}[1] != [2]
221223
@test [1] != Union{Int, Missing}[2]
222224
@test Union{Int, Missing}[1] != Union{Int, Missing}[2]
223225
end
224226

227+
@testset "== and != on tuples" begin
228+
@test ismissing((1, missing) == (1, missing))
229+
@test ismissing(("a", missing) == ("a", missing))
230+
@test ismissing((missing,) == (missing,))
231+
@test ismissing((missing, 2) == (1, missing))
232+
@test !((missing, 1) == (missing, 2))
233+
234+
@test ismissing((1, missing) != (1, missing))
235+
@test ismissing(("a", missing) != ("a", missing))
236+
@test ismissing((missing,) != (missing,))
237+
@test ismissing((missing, 2) != (1, missing))
238+
@test (missing, 1) != (missing, 2)
239+
end
240+
225241
@testset "any & all" begin
226242
@test any([true, missing])
227243
@test any(x -> x == 1, [1, missing])

0 commit comments

Comments
 (0)