【问题标题】:Short circuit evaluation in ruby / rails with defined?红宝石/导轨中的短路评估是否已定义?
【发布时间】:2015-11-30 21:51:39
【问题描述】:

希望对一个变量进行两个测试,这可能没有在 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

在第二次评估之前发生短路的任何原因?

【问题讨论】:

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


    【解决方案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 %>
    

    【讨论】:

      【解决方案2】:

      我想你想要这个:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        相关资源
        最近更新 更多