1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 07:08:01 +00:00

Add Destructure The First Item From An Array as a Ruby til

This commit is contained in:
jbranchaud
2021-09-23 13:03:25 -05:00
parent 92ed23fc34
commit 95dec7933b
2 changed files with 62 additions and 1 deletions

View File

@@ -10,7 +10,7 @@ pairing with smart people at Hashrocket.
For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).
_1153 TILs and counting..._
_1154 TILs and counting..._
---
@@ -895,6 +895,7 @@ _1153 TILs and counting..._
- [Defaulting To Frozen String Literals](ruby/defaulting-to-frozen-string-literals.md)
- [Define A Custom RSpec Matcher](ruby/define-a-custom-rspec-matcher.md)
- [Define A Method On A Struct](ruby/define-a-method-on-a-struct.md)
- [Destructure The First Item From An Array](ruby/destructure-the-first-item-from-an-array.md)
- [Destructuring Arrays In Blocks](ruby/destructuring-arrays-in-blocks.md)
- [Disassemble Some Codes](ruby/disassemble-some-codes.md)
- [Double Splat To Merge Hashes](ruby/double-splat-to-merge-hashes.md)

View File

@@ -0,0 +1,60 @@
# Destructure The First Item From An Array
In true Ruby fashion, there are plenty of idomatic ways to get the first
item from an array.
One of the ways is with assignment destructuring of the array.
It is common to see assignment destructuring with tuples:
```ruby
> name, email = ['Liz', 'liz.lemon@nbc.com']
=> ["Liz", "liz.lemon@nbc.com"]
> name
=> "Liz"
> email
=> "liz.lemon@nbc.com"
```
If you only want the first element, try this:
```ruby
> name, *rest = ['Liz', 'liz.lemon@nbc.com']
=> ["Liz", "liz.lemon@nbc.com"]
> name
=> "Liz"
> rest
=> ["liz.lemon@nbc.com"]
```
The first element is assigned to `name` and the remaining items in the array
are assigned to `rest`. That's because of the `*`.
I like to use this approach with an array-returning method.
```ruby
> def lookup_person(id)
['Liz', 'liz.lemon@nbc.com', id]
end
=> :lookup_person
> name, *rest = lookup_person(22)
=> ["Liz", "liz.lemon@nbc.com", 22]
> name
=> "Liz"
irb(main):013:0> rest
=> ["liz.lemon@nbc.com", 22]
```
This method works as expected when dealing with an empty array.
```ruby
> name, *rest = []
=> []
> name
=> nil
> rest
=> []
```
In all of these, `, *rest` is important because otherwise the statement will be
a standard variable assignment.