Rails: difference between ENV.fetch() and ENV[]

Ruby on-RailsRubyRuby on-Rails-5

Ruby on-Rails Problem Overview


What is the difference between these two syntax:

ENV.fetch("MY_VAR")

ENV['MY_VAR']

I've seen Rails 5 use both versions of these in difference places and can't figure out what the difference is (apart from the first one being more characters to type).

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

The ENV hash-like object is plain Ruby, not part of Rails. From the fine ENV#[] manual:

> Retrieves the value for environment variable name as a String. Returns nil if the named variable does not exist.

and the fine ENV#fetch manual:

> Retrieves the environment variable name. > > If the given name does not exist and neither default nor a block a provided an IndexError is raised. If a block is given it is called with the missing name to provide a value. If a default value is given it will be returned when no block is given.

So just like Hash#[] and Hash#fetch, the only difference is that fetch allows you to specify the behavior if a key is not found (use a default value passed to fetch, default block passed to fetch, or raise an exception) whereas [] just silently gives you nil if the key isn't found.

In the specific case of:

ENV.fetch("MY_VAR")
ENV['MY_VAR']

the difference is that ENV['MY_VAR'] will give you nil if there is no MY_VAR environment variable but ENV.fetch('MY_VAR') will raise an exception.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionWinkerView Question on Stackoverflow
Solution 1 - Ruby on-Railsmu is too shortView Answer on Stackoverflow