On Thu, Jun 19, 2008 at 3:13 PM, Mike Barton <barton.michael / gmail.com> wrote:
> I think these methods should both do the same thing. The second works,
> however in the first I get errors that string is not matched, where
> hash is an instance of String not hash
>
> def sequences
>    self.alignment.split(/\n/).inject(Hash.new) do |hash, line|
>      id, sequence = line.split(/\s+/,2)
>      # hash.class == String
>      hash[id] = sequence
>    end
> end

How inject works is that it passes the block two values:
an accumulator and one of the elements in the enumerable
(one at a time). In each iteration, the accumulator will be the
return value of the block in the previous iteration.

So in your example, if you want the accumulator to be a hash,
your block should return a hash. Try this (untested):

def sequences
    self.alignment.split(/\n/).inject(Hash.new) do |hash, line|
      id, sequence = line.split(/\s+/,2)
      # hash.class == String
      hash[id] = sequence
      hash    # <<< the change
    end
 end

Hope this helps,

Jesus.