【问题标题】:Conditional assignment not working for possibly undefined variable条件赋值不适用于可能未定义的变量
【发布时间】:2013-06-11 13:36:12
【问题描述】:

我在 Rails 视图部分的开头有这个:

<% enabled = true unless defined?(enabled) %>

这是通过设置默认值来处理调用视图未传入enabled本地时的情况。

但是 enabled 没有设置为 true。

我知道 enabled ||= true 的构造,但我不能在这里使用它,因为传入的值可能是 false。这将被true 覆盖。

【问题讨论】:

  • 如果传入的值为false,在enabled ||= true的情况下,它不会被true覆盖。您的回答很好,但您提出这个问题的逻辑至少值得怀疑:)
  • @ARK ||= 将覆盖任何虚假值。如果false 没有发生覆盖,则应该打印[true, false, true] 的测试:def testme(enabled); enabled ||= true; enabled; end; p [testme(true), testme(false), testme(nil)]。它打印 3 trues。
  • 感谢您的回复。有趣的!我一定会对此进行测试并研究它为什么/如何发生。有趣。
  • @ARK 如果您发现这种行为令人惊讶,请参阅this answer 以更好地了解||。注意enabled ||= expression 等价于enabled = enabled || expression
  • 我在 irb 中测试过,明白你的意思。非常感谢:)

标签: ruby-on-rails ruby partial-views variable-assignment


【解决方案1】:

这解决了它:

<%
  unless defined?(enabled)
    enabled = true
  end
%>

这似乎是因为 ruby​​ 解析器的工作原理。

问题中的条件后缀出现在赋值代码之后,我认为解析器导致变量以nil 值出现,使defined? 返回false。

this ruby forum post

【讨论】:

  • @user153138 我不一定发布问题来寻求帮助。我发布它是为了帮助其他人。在谷歌搜索后,我没有看到任何以简洁的方式专门解决这个问题的信息,所以我希望其他人会发现它有用。请评论问题的优劣和答案本身,而不是时差。
  • @user153138 顺便说一句,见this faq about self-answering
【解决方案2】:

您可以通过将defined? 与 OR 运算符|| 组合来实现与您最初尝试做的类似的效果:

defined?(enabled) || enabled = true

例子:

2.4.4 :001 > enabled
NameError: undefined local variable or method `enabled' for main:Object
    from (irb):1
        ...(etc.)
2.4.4 :002 > defined?(enabule) || enabled = true
 => true 
2.4.4 :003 > enabled
 => true 
2.4.4 :004 > enabled = false
 => false 
2.4.4 :005 > defined?(enabule) || enabled = true
 => true 
2.4.4 :006 > enabled
 => true 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多