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?
希望您传递表达式,而不是 Symbol
。 Symbol
将始终 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 %>
希望对一个变量进行两个测试,可能未在 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?
希望您传递表达式,而不是 Symbol
。 Symbol
将始终 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 %>