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

Posted

技术标签:

【中文标题】Rails:ENV.fetch() 和 ENV[] 之间的区别【英文标题】:Rails: difference between ENV.fetch() and ENV[] 【发布时间】:2018-06-07 17:07:54 【问题描述】:

这两种语法有什么区别:

ENV.fetch("MY_VAR")

ENV['MY_VAR']

我已经看到 Rails 5 在不同的地方使用这两个版本,但不知道有什么区别(除了第一个需要输入更多字符)。

【问题讨论】:

@JörgWMittag 其他人都很清楚他们在问什么,并不是每个人在提问时都会查阅字典。如果您需要展示您对英语的掌握程度,欢迎您提供自己的答案。 【参考方案1】:

ENV 类哈希对象是普通的 Ruby,不是 Rails 的一部分。来自fine ENV#[] manual:

检索环境变量name 的值作为字符串。如果命名变量不存在,则返回 nil

还有fine ENV#fetch manual:

检索环境变量name

如果给定的名称不存在,并且default 和块 a 均不存在,则会引发 IndexError。如果给定了一个块,则使用缺少的名称调用它以提供一个值。如果给出了默认值,则在没有给出块时将返回。

所以就像Hash#[]Hash#fetch 一样,唯一的区别是fetch 允许您指定未找到键时的行为(使用传递给fetch 的默认值,传递给@ 的默认块987654336@,或引发异常)而[] 只是在找不到密钥时默默地给你nil

具体情况如下:

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

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

【讨论】:

这是使用默认值的方式:ENV.fetch('NON_EXISTENT') 'returns this string' ENV.fetch('NON_EXISTENT', 'my default value')@estani @YannickSchuchmann 确实!我的例子应该是ENV.fetch('NON_EXISTENT') <compute the value> 或更适合块的东西。否则,您评论中的第二个参数要好得多。

以上是关于Rails:ENV.fetch() 和 ENV[] 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

将 Rails + Puma + Postgres 应用程序部署到 Elastic beanstalk 的正确方法?

谁在运行Puma或Passenger时设置RAILS_MAX_THREADS环境变量?

opsworks rails.env 与自定义 json rails_env 不匹配

.env 未使用 rspec 在 Rails 的测试环境中加载

如何在 nginx、passenger 和 redmine 中使用不同的 rails_env

根据当前 Rails.env 配置变量