web-dev-qa-db-ja.com

Rails:ENV.fetch()とENV []の違い

これら2つの構文の違いは何ですか?

ENV.fetch("MY_VAR")

ENV['MY_VAR']

Rails 5はこれらの両方のバージョンを異なる場所で使用し、違いが何であるかを理解できません(最初の1つが入力する文字が多いことを除いて)。

25
Winker

ENVのハッシュに似たオブジェクトはプレーンなRubyであり、Railsの一部ではありません。 fine _ENV#[]_ manual から:

環境変数nameの値を文字列として取得します。名前付き変数が存在しない場合はnilを返します。

および fine _ENV#fetch_ manual

環境変数nameを取得します。

指定された名前が存在せず、defaultもブロックもない場合、IndexErrorが発生します。ブロックが指定されている場合、値を提供するために欠落している名前で呼び出されます。デフォルト値が指定されている場合、ブロックが指定されていないときに返されます。

つまり、 _Hash#[]__Hash#fetch_ のように、fetchを使用すると、キーが見つからない(fetchに渡されるデフォルト値を使用する、fetchに渡されるデフォルトブロックを使用する、または例外を発生させる)一方で、_[]_は単にnilキーが見つかりません。

特定の場合:

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

違いは、_ENV['MY_VAR']_環境変数がない場合、_MY_VAR_はnilを提供しますが、ENV.fetch('MY_VAR')は例外を発生させます。

48
mu is too short