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

问题描述 投票:5回答:2

我正在检查一个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?的区别是什么?

ruby-on-rails ruby
2个回答
7
投票

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

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

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


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 %>
© www.soinside.com 2019 - 2024. All rights reserved.