2008/1/7, Robert Dober <robert.dober / gmail.com>: > On Jan 7, 2008 5:15 AM, <scooterm / hotmail.com> wrote: > > %w{ ant bear cat}.all? {|word| word.length >= 3} #=> true > > %w{ ant bear cat}.any? {|word| word.length >= 3} #=> true > > > > Both of these return true or false as expected. The question is > > is there an equivalent method that returns the original enum object > > itself (instead of just "true") if the test is satisfied? And nil or > > false > > if otherwise? > For #any? the response to your question is yes, #detect or #find. But see below. I don't think so. The OP wanted the enum not the element(s). > For #all? however there is none, you shall define what you want, the > first, the last a random element satisfying the block? He wants the enum. Like in def my_test(enum) enum.any? {|x| x.length >= 3} ? enum : nil end > Does not make too much sense for me, but maybe you could give us a usecase? That would be good. At the moment I cannot see the advantage of the proposed solution because if you wanted to work with the return value you would have to store it in a local variable anyway. Otherwise you would end up invoking an Enumerable method on nil. > > I know code for this can be easily written, but the reason for the > > question is a matter of style; because it would be > > really nice not to have to specify the enum object more than one > > time if the test is satisfied. > > > > For example, in simple english, the "any" test would be: "If any item > > passes the test, then return all of the items". > This indeed is just a different case, I myself have enhanced grep to > do this in my labrador library, so you can say > enum.grep{|e| e.length > 2 } a common idiom to do this is The bit above can be done with #select - IMHO no need to enhance #grep for this. > enum.map{|e| cond(e) ? : e : nil }.compact What is the advantage of the bit above over enum.select {|e| cond(e)} ? Am I missing something? Kind regards robert -- use.inject do |as, often| as.you_can - without end