very simple question about enum.all? and any?

S

scooterm

%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?

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".
 
R

Robert Dober

%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.
For #all? however there is none, you shall define what you want, the
first, the last a random element satisfying the block?
Does not make too much sense for me, but maybe you could give us a usecase?
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

enum.map{|e| cond(e) ? : e : nil }.compact

HTH
Robert
 
R

Robert Klemme

2008/1/7 said:
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.
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
 
R

Robert Dober

I don't think so. The OP wanted the enum not the element(s).


He wants the enum. Like in

def my_test(enum)
enum.any? {|x| x.length >= 3} ? enum : nil
end


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.


The bit above can be done with #select - IMHO no need to enhance #grep for this.
I am not worthy, I am just posting nonsense, arrgh
What is the advantage of the bit above over

enum.select {|e| cond(e)}

You tell me ;)
? Am I missing something?
No I have been quite stupid...

But one thing really strikes me, if OP wanted the enum
e.any? {} && e
e.all? {} && e
would be what he wants, right? I must be quite confused....

Cheers
Robert
 
R

Robert Klemme

But one thing really strikes me, if OP wanted the enum
e.any? {} && e
e.all? {} && e
would be what he wants, right? I must be quite confused....

No, actually this is better than the ternary operator thingy that I
suggested above. Umpf! That's a good example that communities can turn
up better solutions than individuals. (Although, since only Robert was
involved...) :)

I am still waiting for a proper use case of this though. OP?

Cheers

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top