[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

How do I unsplat something?

Patrick Li

8/12/2008 4:22:00 PM

Hi,
Is there any easy to unsplat an item?
ie. 1 becomes [1]
[2,3] remains [2,3] ?

so far i found:
a = *[1]
*b = *a #=> [1]
a = *[1,2]
*b = *a #=> [1,2]

but this doesn't work if a is a hash, because hash overrides the to_a
method
a = *[{"a"=>1}]
*b = *a #=> [["a",1]] when i actually want: [{"a"=>1}]

Thanks for helping
-Patrick
--
Posted via http://www.ruby-....

9 Answers

Robert Klemme

8/12/2008 4:39:00 PM

0

On 12.08.2008 18:21, Patrick Li wrote:
> Is there any easy to unsplat an item?
> ie. 1 becomes [1]
> [2,3] remains [2,3] ?
>
> so far i found:
> a = *[1]
> *b = *a #=> [1]
> a = *[1,2]
> *b = *a #=> [1,2]
>
> but this doesn't work if a is a hash, because hash overrides the to_a
> method
> a = *[{"a"=>1}]
> *b = *a #=> [["a",1]] when i actually want: [{"a"=>1}]

What result are you trying to get?

robert

Shadowfirebird

8/12/2008 4:40:00 PM

0

# this do?

def unsplat(x)
return [x].flatten
end




On Tue, Aug 12, 2008 at 5:21 PM, Patrick Li <patrickli_2001@hotmail.com> wrote:
> Hi,
> Is there any easy to unsplat an item?
> ie. 1 becomes [1]
> [2,3] remains [2,3] ?
>
> so far i found:
> a = *[1]
> *b = *a #=> [1]
> a = *[1,2]
> *b = *a #=> [1,2]
>
> but this doesn't work if a is a hash, because hash overrides the to_a
> method
> a = *[{"a"=>1}]
> *b = *a #=> [["a",1]] when i actually want: [{"a"=>1}]
>
> Thanks for helping
> -Patrick
> --
> Posted via http://www.ruby-....
>
>



--
All you can do is try to know who your friends are as you head off to
the war / Pick a star on the dark horizon and follow the light

Patrick Li

8/12/2008 4:49:00 PM

0

Yup that does nicely. Thanks very much.
--
Posted via http://www.ruby-....

John Barnette

8/12/2008 5:01:00 PM

0

Hi,

On Tue, Aug 12, 2008 at 9:49 AM, Patrick Li <patrickli_2001@hotmail.com> wrote:
> Yup that does nicely. Thanks very much.

Are you sure you want to flatten that far? Why not just arrayify?

Array(1) # => 1
Array([2,3]) # => [2,3]
Array([4,[5,6]]) # => [4,[5,6]]


~ j.

Avdi Grimm

8/12/2008 6:59:00 PM

0

On Tue, Aug 12, 2008 at 12:39 PM, Shadowfirebird
<shadowfirebird@gmail.com> wrote:
> # this do?
>
> def unsplat(x)
> return [x].flatten
> end

Just a warning, #flatten is not the inverse of splat, because it
recurses arbitrary levels of nested array.

--
Avdi

Home: http:...
Developer Blog: http:.../devblog/
Twitter: http://twitte...
Journal: http://avdi.livej...

Patrick Li

8/12/2008 7:15:00 PM

0

I can't use Array() because I want:
{"a"=>2} to become [{"a"=>2}]

so far: flatten is the best so far... except that it recursively
flattens inner arrays too... which is not ideal but workable for my
current use.

--
Posted via http://www.ruby-....

Chris Shea

8/12/2008 7:50:00 PM

0

On Aug 12, 1:14 pm, Patrick Li <patrickli_2...@hotmail.com> wrote:
> I can't use Array() because I want:
> {"a"=>2} to become [{"a"=>2}]
>
> so far: flatten is the best so far... except that it recursively
> flattens inner arrays too... which is not ideal but workable for my
> current use.
>
> --
> Posted viahttp://www.ruby-....

There was a ruby quiz that included implementations of a single-level
flatten[1]. Taking from James Gray's solution[2], and minding your
requirements regarding hashes, what about this:

def unsplat(the_splatted)
if the_splatted.kind_of?(Hash)
[the_splatted]
else
[the_splatted].inject(Array.new) { |arr, a| arr.push(*a) }
end
end

unsplat(1) # => [1]
unsplat([2,3]) # => [2, 3]
unsplat([4,[5,6]]) # => [4, [5, 6]]
unsplat({'a'=>2}) # => [{"a"=>2}]

HTH,
Chris

[1] http://www.rubyquiz.com/qu...
[2] http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-t...

Shadowfirebird

8/12/2008 7:58:00 PM

0

# How about:

def unsplat(thing)
if thing.kind_of?(Array)
thing
else
[thing]
end
end

On Tue, Aug 12, 2008 at 8:47 PM, Chris Shea <cmshea@gmail.com> wrote:
> On Aug 12, 1:14 pm, Patrick Li <patrickli_2...@hotmail.com> wrote:
>> I can't use Array() because I want:
>> {"a"=>2} to become [{"a"=>2}]
>>
>> so far: flatten is the best so far... except that it recursively
>> flattens inner arrays too... which is not ideal but workable for my
>> current use.
>>
>> --
>> Posted viahttp://www.ruby-....
>
> There was a ruby quiz that included implementations of a single-level
> flatten[1]. Taking from James Gray's solution[2], and minding your
> requirements regarding hashes, what about this:
>
> def unsplat(the_splatted)
> if the_splatted.kind_of?(Hash)
> [the_splatted]
> else
> [the_splatted].inject(Array.new) { |arr, a| arr.push(*a) }
> end
> end
>
> unsplat(1) # => [1]
> unsplat([2,3]) # => [2, 3]
> unsplat([4,[5,6]]) # => [4, [5, 6]]
> unsplat({'a'=>2}) # => [{"a"=>2}]
>
> HTH,
> Chris
>
> [1] http://www.rubyquiz.com/qu...
> [2] http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-t...
>
>



--
All you can do is try to know who your friends are as you head off to
the war / Pick a star on the dark horizon and follow the light

Patrick Li

8/12/2008 8:28:00 PM

0

lol yeah. Shadowfirebird's hack is the one i'm currently using. I just
wanted to know if there was a easier one-liner way of doing it. It
seemed plausible for there to be reverse operator given a splat
operator.

Anyway thanks for the help
-Patrick

--
Posted via http://www.ruby-....