From: hanmac@... Date: 2019-12-03T12:10:38+00:00 Subject: [ruby-core:96077] [Ruby master Bug#16395] .any? and .all? methods, flawed. Issue #16395 has been updated by Hanmac (Hans Mackowiak). your problem is that `.any?` and `.all?` wants a value returned for the block which is truly or falsely puts returns nil which is falsely, in the second example count += 1 returns an integer which is truly ---------------------------------------- Bug #16395: .any? and .all? methods, flawed. https://bugs.ruby-lang.org/issues/16395#change-82927 * Author: stiuna (Juan Gregorio) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: 2.6.5 * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- The dynamics of the script is simple, no explanations needed, look for yourselves: ``` ruby # 100E1 312A3 8B64 282F C4A B28F result = '99E2E403100E1A685A63312A308B6478282F2B2C4A34B28F7E' virus = ['100E1', '312A3', '8B64', '282F', 'C4A', 'B28F'] count = 0 virus.all? {|i| puts i if result.include? i count += 1 end } puts "Coincidences: #{count}" ``` Out: ``` 100E1 312A3 8B64 282F C4A B28F Coincidences: 6 ``` That's correct. Now change .all? for .any? Out: ``` 100E1 Coincidences: 1 ``` That's not right. Now let's modify the .any? block like this: ``` ruby virus.any? {|i| if result.include? i count += 1 puts "#{count}:#{i}" end } ``` Out: ``` 1:100E1 2:312A3 3:8B64 4:282F 5:C4A 6:B28F Coincidences: 6 ``` That's correct. Now change .any? for .all? Out: ``` 1:100E1 Coincidences: 1 ``` That's not right. Now let's modify the .all? block like this: ``` ruby virus.all? {|i| if result.include? i puts "#{count}:#{i}" count += 1 end } ``` Out: ``` 0:100E1 1:312A3 2:8B64 3:282F 4:C4A 5:B28F Coincidences: 6 ``` That's correct. If you look only I have changed the order of the instructions puts and count. In case you don't understand me, I'll put the complete code with each method: ``` ruby result = '99E2E403100E1A685A63312A308B6478282F2B2C4A34B28F7E' virus = ['100E1', '312A3', '8B64', '282F', 'C4A', 'B28F'] count = 0 virus.any? {|i| if result.include? i # If these two lines change order the program fails. count += 1 puts "#{count}:#{i}" end } puts "Coincidences: #{count}" ``` **The output will print 6 coincidences, but if you change the order of the instructions puts and count the program returns 1 coincidence.** Now with .all? ``` ruby result = '99E2E403100E1A685A63312A308B6478282F2B2C4A34B28F7E' virus = ['100E1', '312A3', '8B64', '282F', 'C4A', 'B28F'] count = 0 virus.all? {|i| if result.include? i # If these two lines change order the program fails. Compare the order with .any? puts "#{count}:#{i}" count += 1 end } puts "Coincidences: #{count}" ``` **The output will print 6 coincidences, but if you change the order of the instructions puts and count the program returns 1 coincidence.** -- https://bugs.ruby-lang.org/ Unsubscribe: