Rails:ENV.fetch()和ENV []之间的区别

Win*_*ker 18 ruby ruby-on-rails ruby-on-rails-5

这两种语法有什么区别:

ENV.fetch("MY_VAR")

ENV['MY_VAR']

我已经看到Rails 5在不同的地方使用这两个版本,并且无法弄清楚区别是什么(除了第一个更多的字符要输入).

mu *_*ort 41

类似ENV哈希的对象是纯Ruby,不是Rails的一部分.从精细ENV#[]手册:

name以String形式检索环境变量的值.nil如果指定的变量不存在,则返回.

精细的ENV#fetch手册:

检索环境变量name.

如果给定的名称不存在,并且既default没有提供块也没有提供一个IndexError.如果给出一个块,则使用缺少的名称调用它以提供值.如果给出了默认值,则在没有给出块时将返回该值.

所以就像Hash#[]Hash#fetch,唯一的区别是,fetch如果找不到密钥(使用传递给默认值,传递fetch默认块fetch或引发异常),则允许您指定行为,而如果密钥是'n' 则[]只是默默地给出nil找到了.

在具体情况下:

ENV.fetch("MY_VAR")
ENV['MY_VAR']
Run Code Online (Sandbox Code Playgroud)

不同之处在于,如果没有环境变量但会引发异常ENV['MY_VAR']会给你.nilMY_VARENV.fetch('MY_VAR')

  • 或`ENV.fetch('NON_EXISTENT', '我的默认值')` @estani (10认同)
  • 这是使用默认值的方式:`ENV.fetch('NON_EXISTENT'){'返回此字符串'}` (3认同)
  • @YannickSchuchmann 确实!我的例子应该是`ENV.fetch('NON_EXISTENT') { <compute the value> }` 或者更适合块的东西。否则,您评论中的第二个参数要好得多。 (3认同)