希望对变量进行两次测试,这可能不会在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
在第二次评估之前出现短路的原因是什么?
答案 0 :(得分:4)
我想你想要这个:
if defined?(var) && var.present?
:var
将始终定义为符号。
> defined?(:var)
=> "expression"
> defined?(var)
=> nil
> var = 1
=> 1
> defined?(var)
=> "local-variable"
答案 1 :(得分:1)
defined?
希望您传递表达式,而不是Symbol
。 Symbol
将始终返回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 %>