'**' as hash splat?

Discussion in 'Ruby' started by Trans, Oct 24, 2006.

  1. Trans

    Trans Guest

    We can:

    a = [2,1]
    [3,*a] #=> [3,2,1]

    How about:

    h = {:b=>2, :a=>1}
    {:c => 3, **h} #=> {:c=>3, :b=>2, :a=>1}

    T.
     
    Trans, Oct 24, 2006
    #1
    1. Advertising

  2. Trans

    matt neuburg Guest

    Trans <> wrote:

    > We can:
    >
    > a = [2,1]
    > [3,*a] #=> [3,2,1]
    >
    > How about:
    >
    > h = {:b=>2, :a=>1}
    > {:c => 3, **h} #=> {:c=>3, :b=>2, :a=>1}


    How about:

    class Hash; alias_method :<<, :merge!; end

    So, for example:

    h = {:b=>2, :a=>1}
    {:c => 3} << h
    #=> {:c=>3, :b=>2, :a=>1}

    But perhaps I'm missing some desideratum other than brevity. m.
    --
    matt neuburg, phd = , http://www.tidbits.com/matt/
    Tiger - http://www.takecontrolbooks.com/tiger-customizing.html
    AppleScript - http://www.amazon.com/gp/product/0596102119
    Read TidBITS! It's free and smart. http://www.tidbits.com
     
    matt neuburg, Oct 24, 2006
    #2
    1. Advertising

  3. Trans

    Ken Bloom Guest

    On Mon, 23 Oct 2006 20:49:55 -0700, Trans wrote:

    > We can:
    >
    > a = [2,1]
    > [3,*a] #=> [3,2,1]
    >
    > How about:
    >
    > h = {:b=>2, :a=>1}
    > {:c => 3, **h} #=> {:c=>3, :b=>2, :a=>1}
    >
    > T.


    The purpose of splat is to convert an array into a list of parameters to a
    method. Since [] is a method, this happens to work well for including an
    array into another array. But that's not its purpose, just a side effect.

    There's no real concept of converting a hash into a list of parameters to
    a function, so there's no splat notation for it.

    If you want to combine hashes, use the merge method

    {:c=>3}.merge(h) #=> {:a=>1, :b=>2, :c=>3}

    --
    Ken Bloom. PhD candidate. Linguistic Cognition Laboratory.
    Department of Computer Science. Illinois Institute of Technology.
    http://www.iit.edu/~kbloom1/
    I've added a signing subkey to my GPG key. Please update your keyring.
     
    Ken Bloom, Oct 24, 2006
    #3
  4. Trans

    Kalman Noel Guest

    Ken Bloom:
    > On Mon, 23 Oct 2006 20:49:55 -0700, Trans wrote:
    >> a = [2,1]
    >> [3,*a] #=> [3,2,1]

    > The purpose of splat is to convert an array into a list of parameters to a
    > method. Since [] is a method,


    irb> method :[]
    NameError: undefined method `[]' for class `Object'

    Kalman
     
    Kalman Noel, Oct 24, 2006
    #4
  5. Trans

    Guest

    Hi --

    On Tue, 24 Oct 2006, Kalman Noel wrote:

    > Ken Bloom:
    >> On Mon, 23 Oct 2006 20:49:55 -0700, Trans wrote:
    >>> a = [2,1]
    >>> [3,*a] #=> [3,2,1]

    >> The purpose of splat is to convert an array into a list of parameters to a
    >> method. Since [] is a method,

    >
    > irb> method :[]
    > NameError: undefined method `[]' for class `Object'


    irb(main):003:0> a = [2,1]
    => [2, 1]
    irb(main):004:0> [3, *a]
    => [3, 2, 1]


    David

    --
    David A. Black |
    Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
    DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
    [1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
    [2] http://dablog.rubypal.com | [4] http://www.rubycentral.org
     
    , Oct 24, 2006
    #5
  6. Trans

    Jacob Fugal Guest

    On 10/24/06, <> wrote:
    > On Tue, 24 Oct 2006, Kalman Noel wrote:
    > > Ken Bloom:
    > >> On Mon, 23 Oct 2006 20:49:55 -0700, Trans wrote:
    > >>> a = [2,1]
    > >>> [3,*a] #=> [3,2,1]
    > >> The purpose of splat is to convert an array into a list of parameters to a
    > >> method. Since [] is a method,

    > >
    > > irb> method :[]
    > > NameError: undefined method `[]' for class `Object'

    >
    > irb(main):003:0> a = [2,1]
    > => [2, 1]
    > irb(main):004:0> [3, *a]
    > => [3, 2, 1]


    I think Kalman was just pointing out that [] (in this case as the
    array literal syntax) is *not* a method, contrary to what Ken had
    claimed.

    Jacob Fugal
     
    Jacob Fugal, Oct 24, 2006
    #6
  7. Trans

    Guest

    Hi --

    On Wed, 25 Oct 2006, Jacob Fugal wrote:

    > On 10/24/06, <> wrote:
    >> On Tue, 24 Oct 2006, Kalman Noel wrote:
    >> > Ken Bloom:
    >> >> On Mon, 23 Oct 2006 20:49:55 -0700, Trans wrote:
    >> >>> a = [2,1]
    >> >>> [3,*a] #=> [3,2,1]
    >> >> The purpose of splat is to convert an array into a list of parameters to

    >> a
    >> >> method. Since [] is a method,
    >> >
    >> > irb> method :[]
    >> > NameError: undefined method `[]' for class `Object'

    >>
    >> irb(main):003:0> a = [2,1]
    >> => [2, 1]
    >> irb(main):004:0> [3, *a]
    >> => [3, 2, 1]

    >
    > I think Kalman was just pointing out that [] (in this case as the
    > array literal syntax) is *not* a method, contrary to what Ken had
    > claimed.


    Right, I didn't pick up on that.


    David

    --
    David A. Black |
    Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
    DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
    [1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
    [2] http://dablog.rubypal.com | [4] http://www.rubycentral.org
     
    , Oct 24, 2006
    #7
  8. Trans

    Rolf Gebauer Guest

    Trans schrieb:

    > We can:
    >
    > a = [2,1]
    > [3,*a] #=> [3,2,1]
    >
    > How about:
    >
    > h = {:b=>2, :a=>1}
    > {:c => 3, **h} #=> {:c=>3, :b=>2, :a=>1}
    >
    > T.

    we can do by using method Hash::[] instead of literal {}

    Hash[ :c, 3, *h ] # => {:c=>3, [:a, 1]=>[:b, 2]}


    Rolf
     
    Rolf Gebauer, Oct 24, 2006
    #8
  9. Trans

    Rolf Gebauer Guest

    Trans schrieb:

    > We can:
    >
    > a = [2,1]
    > [3,*a] #=> [3,2,1]
    >
    > How about:
    >
    > h = {:b=>2, :a=>1}
    > {:c => 3, **h} #=> {:c=>3, :b=>2, :a=>1}
    >
    > T.

    we can do by using method Hash::[] instead of literal {}

    Hash[ :c, 3, *h ] # => {:c=>3, [:a, 1]=>[:b, 2]}


    Rolf
     
    Rolf Gebauer, Oct 24, 2006
    #9
  10. Trans

    Trans Guest

    Ken Bloom wrote:
    > On Mon, 23 Oct 2006 20:49:55 -0700, Trans wrote:
    >
    > > We can:
    > >
    > > a = [2,1]
    > > [3,*a] #=> [3,2,1]
    > >
    > > How about:
    > >
    > > h = {:b=>2, :a=>1}
    > > {:c => 3, **h} #=> {:c=>3, :b=>2, :a=>1}
    > >
    > > T.

    >
    > The purpose of splat is to convert an array into a list of parameters to a
    > method. Since [] is a method, this happens to work well for including an
    > array into another array. But that's not its purpose, just a side effect.
    >
    > There's no real concept of converting a hash into a list of parameters to
    > a function, so there's no splat notation for it.


    Not so for Ruby 2.0, assuming we do indeed get key parameters:

    def foo( **keys )
    p keys
    end

    > If you want to combine hashes, use the merge method
    >
    > {:c=>3}.merge(h) #=> {:a=>1, :b=>2, :c=>3}


    And with arrays one can use #+. That's fine, but it lacks a certain
    elegance in some instances.
    T.
     
    Trans, Oct 24, 2006
    #10
  11. Trans

    Rolf Gebauer Guest

    Rolf Gebauer schrieb:

    > Trans schrieb:
    >
    > > We can:
    > >
    > > a = [2,1]
    > > [3,*a] #=> [3,2,1]
    > >
    > > How about:
    > >
    > > h = {:b=>2, :a=>1}
    > > {:c => 3, **h} #=> {:c=>3, :b=>2, :a=>1}
    > >
    > > T.

    > we can do by using method Hash::[] instead of literal {}
    >
    > Hash[ :c, 3, *h ] # => {:c=>3, [:a, 1]=>[:b, 2]}
    >
    >


    sorry for (twice) rubbish
    must be :
    Hash[ :c, 3, *h.to_a.flatten ] # => {:c=>3, [:a, 1]=>[:b, 2]}

    Rolf
     
    Rolf Gebauer, Oct 25, 2006
    #11
  12. On 10/25/06, Robert Dober <> wrote:
    > On 10/24/06, Kalman Noel <> wrote:
    > >
    > > Ken Bloom:
    > > > On Mon, 23 Oct 2006 20:49:55 -0700, Trans wrote:
    > > >> a = [2,1]
    > > >> [3,*a] #=> [3,2,1]
    > > > The purpose of splat is to convert an array into a list of parameters to

    > > a
    > > > method. Since [] is a method,

    > >
    > > irb> method :[]
    > > NameError: undefined method `[]' for class `Object'


    >
    > Maybe you want to try this
    >
    > Array.instance_method :[]


    But I think that Kalman's point wasn't that there are no :[] methods,
    which of course there are, but that the snippet

    [3, *a]

    Isn't a method call but syntax.

    And adding to that, splat isn't just for method parameters, but for
    cases like this as well as parallel assignment.

    And I think of splat as primarily a parallel assignment 'thing' since
    both argument passing and literal construction can be viewed as usages
    of parallel assignment.

    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
     
    Rick DeNatale, Oct 25, 2006
    #12
  13. Trans

    Kalman Noel Guest

    Rick DeNatale:
    > Robert Dober:
    >> Kalman Noel:
    >>> Ken Bloom:
    >>>> Trans:
    >>>>> a = [2,1]
    >>>>> [3,*a] #=> [3,2,1]
    >>>> Since [] is a method,
    >>>
    >>> irb> method :[]
    >>> NameError: undefined method `[]' for class `Object'

    >>
    >> Array.instance_method :[]

    >
    > But I think that Kalman's point wasn't that there are no :[] methods,
    > which of course there are, but that the snippet
    >
    > [3, *a]
    >
    > Isn't a method call but syntax.


    Exactly.

    Kalman
     
    Kalman Noel, Oct 26, 2006
    #13
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. rp
    Replies:
    1
    Views:
    556
    red floyd
    Nov 10, 2011
  2. Daniel Berger

    Doing a splat within a C extension

    Daniel Berger, Nov 3, 2005, in forum: Ruby
    Replies:
    3
    Views:
    131
  3. Eero Saynatkari

    Splat, #to_ary and #to_a

    Eero Saynatkari, Sep 18, 2006, in forum: Ruby
    Replies:
    18
    Views:
    246
    Rick DeNatale
    Sep 20, 2006
  4. Adam Shelly

    redefining splat?

    Adam Shelly, Oct 2, 2006, in forum: Ruby
    Replies:
    10
    Views:
    368
    Martin Coxall
    Oct 3, 2006
  5. Gary Wright
    Replies:
    3
    Views:
    118
    Macario Ortega
    Jun 3, 2009
Loading...

Share This Page