5

我正在检查一个 Rails 项目。在 ERuby HTML 模板页面上,我看到如下几行:

<% option_1 = false if option_1.nil? %>
<% option_2 = false if option_2.nil? %>
<% option_3 = false if option_3.nil? %>

我不明白为什么它不是这样写的:

<% option_1 ||= false %>

||=在这种情况下和有什么区别if nil?

4

2 回答 2

7

在这种特殊情况下,没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是被不当使用。在 Ruby 中,很少有东西在逻辑上是错误的,只有字面上的falsenil是。

这意味着类似if (!x.nil?)的代码几乎总是更好地表达为,除非有可能是字面if (x)的期望。xfalse

我会切换到它,||= false因为它具有相同的结果,但这在很大程度上是一个偏好问题。唯一的缺点是每次运行该行时都会发生分配,而不是.nil?测试一次。

于 2018-06-12T05:07:27.000 回答
1

您可以local_assigns在视图中使用而不是定义缺少的局部变量来引用局部变量,而不会导致NameError.

所以而不是:

<% option_1 ||= false %>
<% option_2 ||= false %>
<% option_3 ||= false %>

<% if option_1 %>
  ...
<% end %>

<% if option_2 %>
  ...
<% end %>

你有:

<% if local_assigns[:option_1] %>
  ...
<% end %>

<% if local_assigns[:option_2] %>
  ...
<% end %>
于 2018-06-12T11:33:41.393 回答