Antipattern: Using Ruby's Hash#[]
![Antipattern: Using Ruby's Hash#[]](/blog/content/images/size/w2000/2021/03/engineering-hacks-generic-11.png)
This is part of our antipatterns series. Ouch! Updated for 2017!
Ask yourself why you're using Hash#[]
. It is is a great way to introduce silent bugs into your app.
Use Hash#fetch
if you expect the value to exist
That way you get sensible error messages.
#> params = {}
#> params.fetch('really').fetch('important')
KeyError: key not found: "really"
Use Hash#dig
if you don't care
Because you don't get idiotic, non-semantic NoMethodError: undefined method '[]' for nil:NilClass
errors.
#> params.dig('really', 'important')
=> nil
Avoid Hash#[]
because... just... why?
#> params['really']['important']
NoMethodError: undefined method `[]' for nil:NilClass
Special case: ENV
The Twelve-Factor App has us all using environment variables. But most of us default to ENV#[]
to look stuff up... even if it's critical. Bad idea! Use fetch
!
#> ENV['REALLY_IMPORTANT'] == 'thing'
=> false # well i hope you didn't need that
#> ENV.fetch('REALLY_IMPORTANT') == 'thing'
KeyError: key not found: "REALLY_IMPORTANT"