Forum: Ruby Bloc param parens |memo, (a, b)|

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Tj H. (Guest)
on 2009-01-16 20:02
In Ruby < 1.9 what does this really do? For example I wrote

class String
  def tokenize! hash
    hash.inject(self) { |s, (k, v)| s.gsub! /:#{k}/, v }
  end
end

Which has a usage of:
'Welcome :name, enjoy your :object'.tokenize!({ :name => 'TJ', :object
=> 'cookie' })

anyways, the inject did not work as desired until I put parens around
the last two parameters, yet I do not entirely understand whats going
here! does this just cause the distribution of the variables to change?
Gary W. (Guest)
on 2009-01-16 20:29
(Received via mailing list)
On Jan 16, 2009, at 1:01 PM, Tj Holowaychuk wrote:

> => 'cookie' })
>
> anyways, the inject did not work as desired until I put parens around
> the last two parameters, yet I do not entirely understand whats going
> here! does this just cause the distribution of the variables to
> change?

When you enumerate over a hash you get a series of arrays.  Each array
has two elements: [key, value].   If your inject block only has two
arguments
defined, the second argument will be an array of two elements.  When you
insert the parens the second argument is decomposed according to Ruby's
multiple assignment rules.  Like this:

  k,v  = array[0], array[1]

Gary W.
Tj H. (Guest)
on 2009-01-16 22:09
Thanks for the reply! I get it now, just never really took the time to
check that stuff out

    def test &block
      yield 1, [2, 3]
    end

    test do |a, b, c|
      p a
      p b
      p c
    end

    puts

    test do |a, (b, c)|
      p a
      p b
      p c
    end

that demonstrated it pretty well
This topic is locked and can not be replied to.