如果a.nil,`a || = b`和`a = b之间的区别?

时间:2018-06-12 05:03:51

标签: ruby-on-rails ruby

我正在检查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?有什么区别?

2 个答案:

答案 0 :(得分:7)

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

这意味着像if (!x.nil?)这样的代码几乎总是更好地表达为if (x),除非期望x可能是文字false

我将其切换为||= false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是,每次运行该行时都会进行赋值,而不是使用.nil?测试运行一次。

答案 1 :(得分: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 %>