这两种语法的区别是什么:

ENV.fetch("MY_VAR")

ENV['MY_VAR']

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

推荐答案

ENV散列类对象是纯Ruby,不是Rails的一部分.从fine ENV#[] manual人中:

以字符串形式检索环境变量name的值.如果命名变量不存在,则返回nil.

fine ENV#fetch manual人:

检索环境变量name.

如果给定的名称不存在,并且default或块a都不存在,则会引发索引器.如果给定了一个块,则会用缺少的名称调用它以提供一个值.如果给定了默认值,则在未给定块时将返回该值.

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

在具体情况下:

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

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

Ruby-on-rails相关问答推荐

Rails HotWire和View Components:涡轮框架不会取代内容

如何在rails 7中禁用Simple_Form验证

Rails 使用多个外键创建/构建

在 Ruby on Rails html.erb 文件中循环

Rails 自动加载完全大写的名称,如 API

使用brew 软件安装了 elasticsearch,但找不到配置文件

循环大量记录时 Ruby on Rails 内存泄漏; find_each 没有帮助

如何为 Rails SimpleForm Select 框设置默认 Select 值

在两个 DateTime 之间迭代,步长为一小时

如何在rails中异步加载部分页面

未捕获的类型错误:未定义不是函数- 初学者 Backbone.js 应用程序

Rails:使用 gem 卸载特定版本的库

Rails:进行不可逆转的迁移是不是很糟糕?

如何检测导致 Rake 中的弃用警告的原因

获取完整的 rails 控制器名称,包括命名空间

在 Rails 协会中未找到名为的协会可能拼写错误的问题

Mongoid OR 查询语法

如何强制 RSpec 测试失败?

Rails 路由:GET 没有参数 :id

如何在 Ruby 类/模块命名空间中翻译模型?