On Sat, 7 Jan 2006, Eero Saynatkari wrote:

> On 2006.01.07 13:36, James Edward Gray II wrote:
>> I have a group of classes, all implementing a parse?() class method.
>> Calling parse?(token) will return the constructed object, if it can
>> be parsed by this class, or false otherwise.
>>
>> I want to run a bunch of tokens through these classes, grabbing the
>> first fit.  For example:
>>
>>   elements = tokens.map do |token|
>>     ClassA.parse?(token) or
>>     ClassB.parse?(token) or
>>     ClassC.parse?(token)
>>   end
>>
>> That works.  Now can anyone give me a version of the middle section
>> that doesn't require I call parse?() 50 times?  I want something
>> close to:
>>
>>   elements = tokens.map do |token|
>>     [ClassA, ClassB, ClassC].find { |kind| kind.parse?(token) }
>>   end
>
>  # Not tested
>  elements  = tokens.map {|token|
>                [A, B, C].each {|kind|
>                  result = kind.parse?(token) and break result
>                }
>              }

fails when no kind parses.  in this case the result will be

   [[A,B,C]] (the return of each...)

regards.

-a
-- 
===============================================================================
| ara [dot] t [dot] howard [at] noaa [dot] gov
| strong and healthy,
| who thinks of sickness until it strikes like lightning?
| preoccupied with the world,
| who thinks of death, until it arrives like thunder?
| -- milarepa
===============================================================================