ruby / rails 中的短路评估有定义吗?

Short circuit evaluation in ruby / rails with defined?

希望对一个变量进行两个测试,可能未在 rails 视图中定义。

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

但是,如果未定义 var,则会引发 undefined local variable or method 错误。我假设 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

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

我想你想要这个:

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

:var 将始终被定义为一个符号。

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

defined? 希望您传递表达式,而不是 SymbolSymbol 将始终 return 为真。

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 %>