From: "Martin J. Dürst" Date: 2013-08-03T14:03:08+09:00 Subject: [ruby-core:56345] Re: [CommonRuby - Feature #8723] Array.any? predicate returns true for empty array. Several explanations for the correctness of how Ruby currently works have already been given. Here's one more: For any Enumerable, e.g. [x, y, z], Enumerable#any {|x| predicate(x) } is essentially the Ruby way of expressing predicate(x) ��� predicate(y) ��� predicate(z). This is similar to calculating a sum (with addition) or a product (with multiplication). For #all, replace the logical or with a logical and (���). In Math (and therefore in Unicode) there are even big versions of ��� and ��� for these operations, in the same way there are big versions of �� and �� for sum and product notations. What do you get when you calculate the sum of 0 elements? 0 of course. And what do you get when you calculate the product of 0 elements? 1. Why do you get 0 and 1 in these cases? Because 0 ad 1 are the neutral element for addition and multiplication. The neutral element is the number that you can add (or multiply) as many times as you want without changing the result. So what's the neutral element of logical or (���)? It's false. And what's the neutral element of logical and (���)? It's true. That means that we get false for [].any {|x| predicate(x) }, and true for [].all {|x| predicate(x) }. Changing to a more programmer-oriented viewpoint, all the above can be computated as follows (pseudocode): memo = neutral_element for x in Enumerable do memo = memo operation x # or predicate(x) end or in Ruby: inject(neutral_element) { |memo, x| memo = memo operation x } or for the inidividual cases: sum: inject(0) { |memo, x| memo += x } product: inject(1) { |memo, x| memo *= x } any: inject(false) { |memo, x| memo = memo || predicate(x) } all: inject(true) { |memo, x| memo = memo && predicate(x) } I hope you can see the symmetry and how this all works out nicely (and how we would need to make all kinds of weird special rules if it worked otherwise). Regards, Martin. On 2013/08/02 21:42, nurettin (Nurettin Onur TUGCU) wrote: > > Issue #8723 has been updated by nurettin (Nurettin Onur TUGCU). > > > Yes, I meant for .all? (wasn't able to edit) and the behavior is correct according to docs, and incorrect according to my interpretation of sets. (can a predicate be true when you have empty set?) > ---------------------------------------- > Feature #8723: Array.any? predicate returns true for empty array. > https://bugs.ruby-lang.org/issues/8723#change-40831 > > Author: nurettin (Nurettin Onur TUGCU) > Status: Feedback > Priority: Normal > Assignee: > Category: > Target version: > > > Are all your children redheaded? > Would this be true if you have no children? > I have no children, therefore none of my children are redheaded. > Therefore > [].any?{ true } == true makes no sense. > Expected behavior: > [].any?{ true } == false because the array is empty. > >