diff --git a/README.md b/README.md index 7d6e167..ba55047 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/ruby/reference-hash-key-with-safe-navigation.md b/ruby/reference-hash-key-with-safe-navigation.md new file mode 100644 index 0000000..c1e6c51 --- /dev/null +++ b/ruby/reference-hash-key-with-safe-navigation.md @@ -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) +```