0

寻找对变量有两个测试,这可能不是在rails视图中定义的。ruby​​/rails中的短路评估与定义?

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

然而,当没有定义var这被投掷undefined local variable or method错误。我假设的Ruby/Rails会短路的第一个表达式,而不是试图评估第二,类似蟒蛇

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

有什么理由短路前述的第二个评价是什么?

回答

4

我想你想要这样的:

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

:var因为它是一个象征将永远被定义。

> defined?(:var) 
=> "expression" 
> defined?(var) 
=> nil 
> var = 1 
=> 1 
> defined?(var) 
=> "local-variable" 
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 %>