红宝石/铁轨的短路评估定义?

时间:2015-09-04 16:58:12

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-2.0 short-circuiting

希望对变量进行两次测试,这可能不会在rails视图中定义。

<% if defined(:var) && var.present? %>
    <%= var.value %>
<% end %>

但是,如果未定义undefined local variable or method,则会导致var错误。我假设ruby / rails会使第一个表达式短路,而不是尝试评估第二个表达式,类似于python

>>> a = False
>>> a and b
False
>>> b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined

在第二次评估之前出现短路的原因是什么?

2 个答案:

答案 0 :(得分:4)

我想你想要这个:

if defined?(var) && var.present?

:var将始终定义为符号。

> defined?(:var)
=> "expression"
> defined?(var)
=> nil
> var = 1
=> 1
> defined?(var)
=> "local-variable"

答案 1 :(得分:1)

defined?希望您传递表达式,而不是SymbolSymbol将始终返回true。

2.1.5 :001 > defined? var
 => nil
2.1.5 :002 > defined? :var
 => "expression"
2.1.5 :003 > var = nil
 => nil
2.1.5 :004 > defined? var
 => "local-variable"

因此

<% if defined?(var) && var.present? %>
  <%= var.value %>
<% end %>