1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-02 22:58:01 +00:00

Add Reference Hash Key With Safe Navigation as a Ruby TIL

This commit is contained in:
jbranchaud
2025-11-09 17:12:09 -05:00
parent 113b7b2dfe
commit e2eb31a4a9
2 changed files with 32 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).
_1682 TILs and counting..._
_1683 TILs and counting..._
See some of the other learning resources I work on:
@@ -1420,6 +1420,7 @@ If you've learned something here, support my efforts writing daily TILs by
- [Rake Only Lists Tasks With Descriptions](ruby/rake-only-lists-tasks-with-descriptions.md)
- [Read The First Line From A File](ruby/read-the-first-line-from-a-file.md)
- [Refer To Implicit Block Argument With It](ruby/refer-to-implicit-block-argument-with-it.md)
- [Reference Hash Key With Safe Navigation](ruby/reference-hash-key-with-safe-navigation.md)
- [Rendering ERB](ruby/rendering-erb.md)
- [Replace The Current Process With An External Command](ruby/replace-the-current-process-with-an-external-command.md)
- [Require Entire Gemfile In Pry Session](ruby/require-entire-gemfile-in-pry-session.md)

View File

@@ -0,0 +1,30 @@
# Reference Hash Key With Safe Navigation
Let's say we have a variable that we expect to be a hash, but could also be
`nil`. We want to try to grab a value from that hash by referencing a specific
key. Because it could be `nil`, we cannot simply do:
```ruby
stuff[:key]
```
As that could result in `NoMethodError: undefined method '[]' for nil
(NoMethodError)`.
We should use the _safe navigation_ operator (`&`) to avoid raising that error.
However, we should pay attention to a necessary syntax shift from the short-hand
`[:key]` to the long-hand `[](:key)`.
```ruby
stuff&.[](:key)
```
The meaning of this syntax is that we are calling the `#[]` method and we pass
it a single argument `:key` wrapped in parentheses.
Another approach would be to use `#dig` which can feel more ergonomic than the
above syntax switch.
```ruby
stuff&.dig(:key)
```