citizen428.blog()

Try to learn something about everything

Destructuring Binds in Ruby

When we “swap variables in Ruby”, what really happens is something called “a destructuring binding” in other languages:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> x = 10
=> 10
>> y = 20
=> 20
>> x.object_id
=> 21
>> y.object_id
=> 41
>> x, y = y, x
=> [20, 10]
>> x.object_id
=> 41
>> y.object_id
=> 21

This is only the beginning though:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
>> a = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
>> # assign first 2 elements to x and y
>> # throw away the rest
>> x, y = a
=> [1, 2, 3, 4, 5]
>> x
=> 1
>> y
=> 2
>> # assign first 2 elements to x and y
>> # assign rest to z
>> x, y, *z  = a
=> [1, 2, 3, 4, 5]
>> x
=> 1
>> y
=> 2
>> z
=> [3, 4, 5]
>> # assign first 2 elements to x and y
>> # throw away the third
>> # assign the rest to z
>> x, y, _, *z = a
=> [1, 2, 3, 4, 5]
>> x
=> 1
>> y
=> 2
>> z
=> [4, 5]
>> # if there aren't enough rvalues,
>> # remaining lvalues are nil
>> a, b = 1
=> 1
>> b
=> nil

The reason I’m posting this long explanation is that destructuring is often useful and can do much more for you than “just” swap variables, yet I rarely see it used to its full potential in Ruby. If only we could have Clojure’s destructuring in Ruby…

Comments