From: shevegen@... Date: 2019-12-03T13:26:56+00:00 Subject: [ruby-core:96080] [Ruby master Bug#16395] .any? and .all? methods, flawed. Issue #16395 has been updated by shevegen (Robert A. Heiler). > The dynamics of the script is simple, no explanations needed, look for yourselves: I do not think that this can be a useful issue description because there may be secondary aspect to consider for when requesting changes, including backwards compatibility after a given change/suggestion. So even if there were a problem in regards to the behaviour, it would be better to include these considerations in the issue tracker, even if you think that any behaviour is flawed or not optimal. If you work with .any? .select and .reject, I personally found it better to split up the tasks, finish working on the dataset, and then do a separate reporting. Right now you combine both in one go, which can lead to the confusion you described. ---------------------------------------- Bug #16395: .any? and .all? methods, flawed. https://bugs.ruby-lang.org/issues/16395#change-82929 * Author: stiuna (Juan Gregorio) * Status: Rejected * 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: