'**' as hash splat?

T

Trans

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.
 
M

matt neuburg

Trans said:
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.
 
K

Ken Bloom

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

dblack

Hi --

Ken Bloom:
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 | (e-mail address removed)
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
 
J

Jacob Fugal

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
 
D

dblack

Hi --

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 | (e-mail address removed)
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
 
R

Rolf Gebauer

Trans said:
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
 
R

Rolf Gebauer

Trans said:
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
 
T

Trans

Ken said:
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.
 
R

Rolf Gebauer

Rolf said:
Trans said:
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
 
R

Rick DeNatale

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.
 
K

Kalman Noel

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,046
Latest member
Gavizuho

Latest Threads

Top