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
                } 
              }

> Except that I want the return result of parse?(), instead of the  
> class that took it.
> 
> Thanks for any tips you can offer.
> 
> James Edward Gray II


E