Robert Klemme
1/7/2008 3:37:00 PM
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