'**' as hash splat?

We can:

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

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

T.

Trans [email protected] wrote:

We can:

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

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

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.

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

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 B.:

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

Hi –

On Tue, 24 Oct 2006, Kalman N. wrote:

Ken B.:

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

Trans schrieb:

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

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

Rolf

On 10/24/06, [email protected] [email protected] wrote:

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

Rolf Gebauer schrieb:

{: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

Ken B. wrote:

{: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.

On 10/24/06, Kalman N. [email protected] wrote:

NameError: undefined method `[]' for class `Object’

Kalman

Maybe you want to try this

Array.instance_method :[]

Cheers
Robert

The reasonable man adapts himself to the world; the unreasonable one
persists in trying to adapt the world to himself. Therefore all progress
depends on the unreasonable man.

• George Bernard Shaw

On 10/24/06, Trans [email protected] wrote:

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

I want this toy +1

{: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.

Completely agree
Robert

The reasonable man adapts himself to the world; the unreasonable one
persists in trying to adapt the world to himself. Therefore all progress
depends on the unreasonable man.

• George Bernard Shaw

Rick DeNatale:

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

On 10/26/06, Rick DeNatale [email protected] wrote:

a
But I think that Kalman’s point wasn’t that there are no :[] methods,
both argument passing and literal construction can be viewed as usages
of parallel assignment.

You are right about all you were saying, only I did not want to make any
I just wanted to underline that :[] was an instance method of Array as
I
did not think about Kalman’s point .
Was I too harsh/quick/offensive? If so I am sorry;
I thaught it was an important minor point to make and I thaught I was
quite
alligned with Kalman’s style but I have no problem in admiting errors

Cheers
Robert

Rick DeNatale

My blog on Ruby

The reasonable man adapts himself to the world; the unreasonable one
persists in trying to adapt the world to himself. Therefore all progress
depends on the unreasonable man.

• George Bernard Shaw

Hi –

On Wed, 25 Oct 2006, Jacob F. wrote:

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

On 10/25/06, Robert D. [email protected] wrote:

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